java 数组排序

选择排序

将要排序的一组数字进行遍历。
第一次遍历,将第一个位置上的数字与后面的数字进行比较,如果后面的数字比第一个位置上的元素小,则将两个数字的位置进行交换。
第二次遍历,将第二个位置上的数字与后面的数字进行比较,如果后面的数字比第二个位置上的元素小,则将两个数字的位置进行交换。
依次进行遍历、位置交换,直到这组数字排序完成。
假设要遍历数字的个数是n,则需要遍历的次数是n-1

public static void selectSort(int[] arr) {
		int temp;
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = i + 1; j < arr.length; j++) {
                        //每次arr[i]和剩下的所有arr[j]依次比较
				if (arr[i] > arr[j]) {
					temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
				}
			}

		}
	}

 冒泡排序:

将要排序的一组数字进行遍历。
第一次遍历,将相邻的两个数字进行比较,直到这组数字全部比较完成,如果前面比后面的数字大,则进行交换位置,此时可以将最大的数字筛选出来,放到最后的位置上。也可以将最小的数字筛选出来放到最后一个位置上.
第二次遍历,将相邻的两个数字进行比较,直到这组数字全部比较完成,如果前面比后面的数字大,则进行交换位置,将这组数字里面第二大的数字筛选出来,放到倒数第二的位置上。
依次进行遍历,交换位置,直到排序完成。

public static void bubbleSort(int[] arr) {
		int temp;
		/*
		 * for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length -
		 * 1- i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1];
		 * arr[j + 1] = temp; } } }
		 */
		// 第一次循环n-1遍
		for (int i = arr.length - 1; i > 0; i--) {
			for (int j = 0; j < i; j++) {
                            //每次是a[j]和a[j+1]比较,前者小于后者就交换,那么最小的一路交换到最后面,
下次就不考虑最后面的那个数,比较前面几个就可以了,以此类推
				if (arr[j] < arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
//降序排列,升序的话只需要将if (arr[j] < arr[j + 1])改为if (arr[j] >arr[j + 1])

快速排序:

快速排序基于分治的思想,每次在数列中选取一个基准值,可以选第一个元素

然后定义两个指针,I,J,

当I<J的时候,J从右向左扫描,找比基准值小的值,I从左向右扫描,找比基准值大的值,找到后交换两者的顺序,

这样进行,总有I=J的时候,(条件就是先让J从右向左扫描,再让I从左到右,才能满足I不大于J的条件),这时候让基准值和I位置的变量交换,基准值左边大数全小于它,基准值右边的数全大于它,完成第一次任务

再来吧,既然基准值左边的数都小于它,但还是乱序的,怎么办,对左边的子序列排序,对右边的子序列排序,递归进行,就会排好

 

代码如下,递归方式下的快速排序

public class QuickSort {
	public static void main(String[] args) {
		int[] arr = { 4, 1, 7, 6, 3, 5, 4, 4 };
		quickSort(arr);
		for (int i : arr) {
			System.out.print(i + ",");
		}
	}

	public static void quickSort(int[] arr) {
		partition(arr, 0, arr.length - 1);
	}

	public static void partition(int[] arr, int left, int right) {
		if (left > right) {
			return;
		}
		int i = left;
		int j = right;
		// 定义基准值为数组第一个数
		int temp = arr[left];

		while (i < j) {
			// 从右往左找比基准值小的数
			while (arr[j] >= temp && i < j) {
				j--;
			}
			// 再从左向右找比基准数大的值,因为j先减小,那么最终交换完成后退出while循环时,i只能等于j
			while (arr[i] <= temp && i < j) {
				i++;
			}
			// 如果i<j,交换它们位置的元素
			if (i < j) {
				int t = arr[i];
				arr[i] = arr[j];
				arr[j] = t;
			}
		}
		// 交换基准值和(i==j)处的元素,使基准值到一个中间位置,
		// 左边序列都小于基准值,乱序,右边序列都大于基准值,乱序
		arr[left] = arr[i];
		arr[i] = temp;
		// 对左边子序列进行快排
		partition(arr, left, i - 1);
		// 对右边子序列进行快排
		partition(arr, i + 1, right);
	}

}

猜你喜欢

转载自blog.csdn.net/sinat_41132860/article/details/83934390