【各种排序系列之】快速排序法

基本思想:

从待排序列中任取一个元素 (例如取第一个) 作为中心,所有比它小的元素一律前放,所有比它大的元素一律后放,形成左右两个子表。

然后再对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个。

此时便为有序序列了。

时间效率:O(nlogn) —因为每趟确定的元素呈指数增加

空间效率:O(logn)—因为递归要用栈(存每层low,high和pivot)

C语言实现:

 1 //首先定义数据类型
 2 #define MAXSIZE 20 //示例的小顺序表的最大长度
 3 typedef int KeyType; //定义关键字类型为整数类型
 4 typedef struct {
 5     KeyType key;        //关键字项
 6     InfoType otherinfo;        //其他数据项
 7 }RedType;                                //记录类型
 8 typedef struct {
 9     RedType r[MAXSIZE]+1;      //r[0]用作哨兵单元
10     int length;                           //顺序表长度
11 }SqList;
12 
13 //一趟快速排序算法
14 int Partition(SqList &L,int low,int high){ //一趟快排
15 r[0]=r[low];  //以子表的首记录作为支点记录,放入r[0]单元
16 int pivotkey=r[low].key;  //取支点的关键码存入pivotkey变量
17 while(low < high){     //从表的两端交替地向中间扫描
18     while(low<high && r[high].key>=pivotkey )
19     { - -high;    }
20       r[low]=r[high];  //比支点小的记录交换到低端;
21     while(low<high && r[low].key<=pivotkey)
22     {  + +low;    }
23       r[high]=r[low];   //比支点大的记录交换到高端
24 r[low]=r[0];     //支点记录到位;
25 return low;    //返回支点记录所在位置。
26 }
27 
28 //整个快速排序的递归算法:
29 void QSort ( SqList  &L,  int low, int high ) {
30     if ( low < high) {
31        pivot = Partition ( L, low, high ); ////一趟快排,将r[ ]一分为二
32         QSort ( L, low, pivot-1); //在左子区间进行递归快排,直到长度为1
33         QSort ( L, pivot+1, high );  //在右子区间进行递归快排,直到长度为1
34     }
35 }
36 
37 
38 //实际中,如果对顺序表L进行快速排序的操作函数为:
39 void QuickSort ( SqList  &L) {
40    QSort ( L,  1,  L.length );
41  }

 

设每个子表的支点都在中间,则:

第1趟比较,可以确定1个元素的位置;

第2趟比较(2个子表),可以再确定2个元素的位置;

第3趟比较(4个子表),可以再确定4个元素的位置;

第4趟比较(8个子表),可以再确定8个元素的位置;

         ……

只需ëlog2nû +1趟便可排好序。

 

posted on 2013-10-28 22:10  Allen Blue  阅读(287)  评论(0编辑  收藏  举报

导航