快速排序

快速排序是一种十分优雅和十分实际有效的算法。

快速排序和归并排序一样,也是一种用递归的算法。归并排序的基本递归操作是合并两个已经排好序的数组,而快速排序的基本递归操作是Partition,当然这个也是快速排序算法的核心,输入一个未排序的数组,选择其中一个元素,如何将它插入到数组中的某个位置,使得这个位置之前的所有元素都小于这个插入的元素,这个位置之后的元素都大于这个待插入的元素,简单来说,把待插入的元素放在排好序之后期望的正确位置上。

 

快速排序算法的划分,也就是Partition使用了交换和一个优雅的扫描模型:

使用两个游标i,j

A[0...i]表示小于x的元素,[i+1...j-1]表示大于x的元素,而[j...size-1]为待探查的元素,如果发现下一个待探查的元素大于x则什么也不做,因为这个元素正好继续加入到大于x的元素行列中,如果小于x,这个时候使用交换此时的A[j]和A[i+1],如此扫描到最后,再进行最后一次交换,将待插入的元素交换到中间的位置即可。


下面参见测试代码:

View Code
/**
 * algorithm name: quick sort
 * implemented by: ivan jobs
 * date: 2012.5.1
 * email: ivan1377@163.com
 */

#include <cstdio>

int Partition(int a[], int p, int r){
  int x = a[r];
  int i = p-1;
  int j;
  for(j=p;j<=r-1;j++){
    if(a[j] <= x){
      i++;
      int tmp = a[i];
      a[i] = a[j];
      a[j] = tmp;
    }
  }
  
  int tmp = a[i+1];
  a[i+1] = a[r];
  a[r] = tmp;

  return i+1;
}

void QuickSort(int a[],int p,int r){
  if(p<r){
    int q = Partition(a, p, r);
    QuickSort(a, p, q-1);
    QuickSort(a, q+1, r);
  }
}

int main(){
  int a[] = {2, 5, 3, 1, 9, 7, 8, 6, 4};
  QuickSort(a, 0, 8);
  
  int i;
  for(i=0;i<9;++i)
    printf("%d ", a[i]);
  printf("\n");

  return 0;
}

 

不妥之处,欢迎指正:)

posted on 2012-05-03 10:49  涅槃火凤  阅读(195)  评论(0编辑  收藏  举报

导航