快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
1.从数列中挑出一个元素,称为 "基准"(pivot),
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
最坏时间复杂度: O(n^2),平均时间复杂度:O(nlogn)
快速排序是不稳定的排序算法。
- #include <stdio.h>
- void swap(int *a, int *b)
- {
- int temp = *a;
- *a = *b;
- *b = temp;
- }
- int partition(int a[], int p, int q)
- {
- int x, i, j;
- x = a[p];/* x as a pivot */
- i = p;
- for (j = p + 1; j < q; j++) {
- if (a[j] <= x) {
- i++;
- swap(&a[i], &a[j]);
- }
- }
- swap(&a[p], &a[i]);
- return i;
- }
- void quick_sort(int a[], int p, int q)
- {
- if (p < q) {
- int r = partition(a, p, q);
- quick_sort(a, p, r); /* sort sub list a[p, r) */
- quick_sort(a, r+1, q);/* sort sub list a[r+1,q) */
- }
- }
- int main()
- {
- int a[] = {6, 10, 13, 5, 8, 3, 2, 11}, i;
- int size = sizeof(a) / sizeof(int);
- quick_sort(a, 0, size);
- for (i = 0; i < size; i++)
- printf("%d ", a[i]);
- return 0;
- }
如果我们调用的是quick_sort(a, 0, size - 1),那么要做以下修改
code 16:j <= q
code 30:quick_sort(a, p, r-1)
code 31:quick_sort(a, r+1, q)