疾速排序(Quick Sort)
1.什么是疾速排序
疾速排序是由东尼·霍尔所倒退的一种排序算法。在均匀情况下,排序 n 个我的项目要 (nlogn) 次比拟。在最坏情况下则须要 (n2) 次比拟,但这种情况并不常见。事实上,疾速排序通常显著比其余 (nlogn) 算法更快,因为它的外部循环(inner loop)能够在大部分的架构上很有效率地被实现进去。
疾速排序应用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
2.算法步骤
从数列中挑出一个元素,称为 "基准"(pivot);
从新排序数列,所有元素比基准值小的摆放在基准后面,所有元素比基准值大的摆在基准的前面(雷同的数能够到任一边)。在这个分区退出之后,该基准就处于数列的两头地位。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
3.动图演示
4.代码实现
public static void main(String[] args) { //初始化数组 int[] arr = {5, 3, 1, 4, 2, 7, 8, 6, 10, 9}; quickSort(arr,0,arr.length -1); System.out.println(Arrays.toString(arr)); } private static void quickSort(int[] arr,int l, int r){ if(l >= r){ return; } int left = l; int right = r; int pivot = arr[left]; while(left < right){ while(left < right && arr[right] >= pivot){ right --; } if(left < right){ arr[left] = arr[right]; } while (left < right && arr[left] <= pivot){ left ++; } if (left < right){ arr[right] = arr[left]; }else{ arr[left] = pivot; } } quickSort(arr,l,right -1); quickSort(arr,right + 1,r); }
正文版本:
public static void main(String[] args) { //初始化数组 int[] arr = {5, 3, 1, 4, 2, 7, 8, 6, 10, 9}; quickSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } private static void quickSort(int[] arr, int l, int r) { if (l >= r) { return; } int left = l; // 0 int right = r; // 9 int pivot = arr[left]; // 5 while (left < right) { /** * 第一次循环:0 < 9 && arr[right] (9) 9 >= 5 条件满足 9 -- = 8 * 第二次循环:0 < 8 && arr[right] (8) 10 >= 5 条件满足 8 -- = 7 * 第三次循环:0 < 7 && arr[right] (7) 6 >= 5 条件满足 7 -- = 6 * 第四次循环:0 < 6 && arr[right] (6) 8 >= 5 条件满足 6 -- = 5 * 第五次循环:0 < 5 && arr[right] (5) 7 >= 5 条件满足 5 -- = 4 * 第六次循环:0 < 4 && arr[right] (4) 2 >= 5 条件不满足 此时 left = 0; right = 4 */ while (left < right && arr[right] >= pivot) { right--; } /** * 0 < 4 */ if (left < right) { /** * arr[left] = 5 * arr[right] = 2 * 执行之后,数组变成如下: * {2, 3, 1, 4, 2, 7, 8, 6, 10, 9}; */ arr[left] = arr[right]; } /** * 第一次循环:0 < 4 && arr[left] (2) <= 5 条件满足 0 ++ = 1 * 第二次循环:1 < 4 && arr[left] (3) <= 5 条件满足 1 ++ = 2 * 第三次循环:2 < 4 && arr[left] (1) <= 5 条件满足 2 ++ = 3 * 第四次循环:3 < 4 && arr[left] (4) <= 5 条件满足 3 ++ = 4 * 第四次循环:4 < 4 条件不满足,此时 left = 4; right = 4 */ while (left < right && arr[left] <= pivot) { left++; } /** * 4 < 4 不满足条件进入else */ if (left < right) { arr[right] = arr[left]; } else { /** * arr[left] = 2; * pivot = 5; * arr[left] = 5; * 此时数组变成如下: * {2, 3, 1, 4, 5, 7, 8, 6, 10, 9}; */ arr[left] = pivot; } } /** * l = 0 * right = 4 * {2, 3, 1, 4}; * quickSort(arr,0,4-1); * 排序基准左侧的数 */ quickSort(arr, l, right - 1); /** * right = 4 * r = 9 * {7, 8, 6, 10, 9}; * quickSort(arr,4 + 1,9); * 排序基准右侧的数 */ quickSort(arr, right + 1, r); }
5.输入后果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]