1、排序算法

排序算法

冒泡排序

算法思路:用第一个作为开始,每次前一个跟后一个作比较,每次循环都能得出一个最大值或最小值。

(从小到大:就是第一个比第二个小,所以当第一个大于第二个时交换位置。从大到小则相反。)

//冒泡排序的方法
public static void bubbleSort(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			//从第二个开始
			for (int j = i+1; j < arr.length; j++) {
				//前一个跟后一个作比较
				if(arr[i]<arr[j]) {
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
	}
}

插入排序

算法思路:从第二位置开始插入,每次比较该位置之前的数据,如果当前数据比位置数据大,将数据往后移,否则,就将数据放在比自己小的前一个位置。

//插入排序
	public static void insertSort(int[] arr) {
		//定义一个临时变量
		int temp = 0;
		//从第二个开始
		for (int i = 1; i < arr.length; i++) {
			//将第二个值存储起来
			temp = arr[i];
			//拿到前一个
			int j = i-1;
			while (j >=	0) {
				//当前数据跟位置数据比较
				if(arr[j] >	temp) {
					arr[j+1] = arr[j];//比较完后数据往后移
				}else {
					break;
				}
				j--;
			}
			//(j的值是将arr[j+1] = arr[j];中的arr[j]的数据加回去)找到插入位置,将temp插入
			arr[j+1] = temp;
		}
	}

选择排序

算法思路:用一个临时的值记录最大或最小值的索引,每次找到一个最大值或最小值的索引,然后判断当前索引跟当前循环的是否相同,如果不同就交换值。

//算法排序
	public static void selectSort(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			//用来记录最小值的下标
			int minIndex = i;
			for (int j = i+1; j < arr.length; j++) {
				//找到最小值的下标
				if(arr[minIndex] > arr[j]) {
					//将最小值的坐标交换
					minIndex = j;
				}
			}
			//如果发现最小值的下标不是当前的下标,就交换位置
			if(minIndex != i) {
				int temp = arr[minIndex];
				arr[minIndex] = arr[i];
				arr[i] = temp;
			}
		}
	}

快速排序

算法思路:定义左右下标,以最后一个数据作为参照物,左坐标从数据的最左边开始,右坐标从数据的前一个开始,左坐标从左往右开始的找第一个比参照物大的值,右坐标从右往左第一个找比参照物小的值。。判断:如果左坐标和右坐标没有交叉,则交换左右的值,如果交叉,交换左坐标跟参照物的值。并把左坐标分成两半。

	//快速排序
	public static void quickSort(int[] arr,int start,int end) {
		//判断是否交叉
		if(start >= end) {
			return;
		}else {
			//中间值
			int middle = findMiddle(arr,start,end);
			//数据分成两边
			quickSort(arr, start, middle-1);
			quickSort(arr, middle+1, end);
		}
	}
	//查找中间值
	private static int  findMiddle(int[] arr,int start,int end) {
		//参照物
		int temp = arr[end];
		//左坐标
		int left = start;
		//右坐标
		int right = end-1;
		//循环找位置
		while (true) {
			//从左边找,第一个比参照物大的值
			while (left < end && arr[left] <= temp) left++;
			if (left == end) break;//参照物是最大的
			//从右边找,第一个比参照物小的
			while(right < start && arr[right]>= temp) right--;
			//判断是否交叉
			if (left < right) {
				//没有交叉
				change(arr,left,right);
				continue;
			}else {
				//有交叉
				change(arr, left, end);
				break;
			}
		}
		return left;
	}
	//交换的方法
	private static void change(int[] arr,int from, int to) {
		int temp = arr[from];
		arr[from] = arr[to];
		arr[to] = temp;
	}
posted @ 2020-04-14 21:55  站着说话不腰疼  阅读(45)  评论(0)    收藏  举报