快速排序

快速排序主要使用分治法的思想,步骤为:

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: }
posted @ 2012-06-01 08:30  Newerth  阅读(187)  评论(0编辑  收藏  举报