快速排序

快速排序

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

算法描述

  • 从数列中挑出一个元素,称为 “基准”(pivot);
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

image
image
image

代码

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);
}
}

总结

分段
排序时以末尾元素为基准,因为这个元素最后一个移动,可以保证基准元素固定,无需去找。