快速排序
快速排序主要使用分治法的思想,步骤为:
1、从数列中挑出一个元素作为基准。
2、重新排列所有元素,所有比基准小的元素放在基准之前,比基准大的元素放在基准之后(等于基准的元素可以放在任意一边)。操纵结束后基准元素所在的位置就是排序后它应该在的位置。
3、递归地对基准左边的子数列和基准右边的子数列分别进行第1、2步操作,直至子数列的元素个数为1。
时间复杂度:O(n * logn)
稳定性: 不稳定 (相等的元素在partition过程中可能会改变相对位置, 比如说我们选取的key)
最坏情况: 数列已排序或逆序, 此时需要时间复杂度O(n^2),可以采用随机化算法选取基准元素。
实现:
1: int partition(int a[], int l, int r)
2: {
3: int key = a[l];
4: int i = l, j = r;
5:
6: while (i < j) {
7: while (i < j && a[i] < key)
8: ++i;
9: while (i < j && a[j] > key)
10: --j;
11: if (i >= j)
12: break;
13: swap(a[i], a[j]);
14: }
15: swap(a[i], a[l]);
16:
17: return i;
18: }
19:
20: void
21: quick_sort(int a[], int l, int r)
22: {
23: int p;
24:
25: if (l < r) {
26: p = partition(a, l, r);
27:
28: quick_sort(a, l, p-1);
29: quick_sort(a, p+1, r);
30: }
31: }