快速排序算法是基于冒泡排序的,是对冒泡排序算法的一个改进。快速排序的效率比较高,是因为它的交换是跳跃式的。每次设置一个基准值,在比较的时候,将小于基准值的元素移到左边,将大于基准值的元素移到右边,这边一般不会只交换相邻的两个数。因此比较和交换的次数都会减少了,排序的效率自然也就高了。
快速排序的思想:
①在数组中找一个基准值,一般是取第一个数(纯粹为了方便);
②建立一个索引right,从数组的尾端开始遍历,直到找到一个比基准值小的数,记录此位置(j);
③建立一个索引left,从数组的首端开始遍历,直到找到一个比基准值大的数,记录此位置(i);
④当 i < j,则交换i和j两个位置上的值,并且继续在j-1位置开始往前遍历,在i+1位置开始往后遍历;
⑤当i == j,证明本次的比较已经结束,此时将i位置的值与基准值交换,基准值已经放在了最终的位置(此时基准值左边的元素都比基准值要小,基准值右边的元素都比基准值要大);
⑥在①~⑤的步骤中,基准值已经放在了正确的位置,我们可以对基准值左边的分区以及基准值右边的分区分别重复进行①~⑤的步骤,直到所有元素有序。
通过以上的步骤可以看出,快速排序算法其实是基于分治算法来实现的。不难写出实现代码:
public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入数组大小:"); int size = sc.nextInt(); int[] arr = new int[size]; System.out.println("请输入数组:"); for(int i = 0; i < size; i++) { arr[i] = sc.nextInt(); } quickSort(arr); for(int a : arr) { System.out.print(a + " "); } } public static void quickSort(int[] arr) { if(arr == null || arr.length <= 1) return; sort(arr, 0, arr.length-1); } public static void sort(int[] arr, int left, int right) { if(left > right) return; int baseVal = arr[left]; int i = left, j = right; while(i != j) { while(arr[j] >= baseVal && j > i) { j--; } while(arr[i] <= baseVal && j > i) { i++; } if(i < j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } arr[left] = arr[i]; arr[i] = baseVal; sort(arr, left, i-1); sort(arr, i+1, right); } }