排序算法——快速排序

来源:互联网 发布:计数型数据过程能力 编辑:程序博客网 时间:2024/05/22 15:41

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤为:

1.从数列中挑出一个元素,称为 "基准"(pivot),
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

最坏时间复杂度: O(n^2),平均时间复杂度:O(nlogn)
快速排序是不稳定的排序算法。

Code:
  1. #include <stdio.h>   
  2.   
  3. void swap(int *a, int *b)   
  4. {   
  5.     int temp = *a;   
  6.     *a = *b;   
  7.     *b = temp;   
  8. }   
  9.   
  10. int partition(int a[], int p, int q)   
  11. {   
  12.     int x, i, j;   
  13.   
  14.     x = a[p];/* x as a pivot */  
  15.     i = p;   
  16.     for (j = p + 1; j < q; j++) {   
  17.         if (a[j] <= x) {   
  18.             i++;   
  19.             swap(&a[i], &a[j]);   
  20.         }   
  21.     }   
  22.     swap(&a[p], &a[i]);   
  23.     return i;   
  24. }   
  25.   
  26. void quick_sort(int a[], int p, int q)   
  27. {   
  28.     if (p < q) {   
  29.         int r = partition(a, p, q);   
  30.         quick_sort(a, p, r);  /* sort sub list a[p, r)  */  
  31.         quick_sort(a, r+1, q);/* sort sub list a[r+1,q) */  
  32.     }   
  33.   
  34. }   
  35.   
  36. int main()   
  37. {   
  38.     int a[] = {6, 10, 13, 5, 8, 3, 2, 11}, i;   
  39.     int size = sizeof(a) / sizeof(int);   
  40.     quick_sort(a, 0, size);   
  41.   
  42.     for (i = 0; i < size; i++)   
  43.         printf("%d ", a[i]);   
  44.     return 0;   
  45. }  

如果我们调用的是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)

原创粉丝点击