快速排序
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
算法描述
- 从数列中挑出一个元素,称为 “基准”(pivot);
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。



代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| private int quickSort(int[] a, int l, int r){ int i = l; for (int j = l; j<r; j++) { if (a[j] < a[r]) { int temp = a[i]; a[i] = a[j]; a[j] = temp; i++; } } int temp = a[i]; a[i] = a[r]; a[r] = temp; return i; }
public void quick(int[] a, int l, int r) { if (l < r) { int q = quickSort(a, l, r); quick(a, l, q-1); quick(a, q+1, r); } }
|
总结
分段
排序时以末尾元素为基准,因为这个元素最后一个移动,可以保证基准元素固定,无需去找。