先定义一下结构体:
#define MAXSIZE 20
typedef struct{
int key; //关键字项
InfoType otherinfo; //其他数据项
}RedType;
typedef struct{
RedType r[MAXSIZE+1]; //r[0]闲置或用作哨兵单元
int length; //顺序表长度
}SqList;
快速排序的基本思想是,通过一趟排序将记录分割成两个独立的部分,其中一部分的记录的关键字均比另一部分记录的关键字都小,再分别对这两部分记录继续进行排序,以达到整个序列有序。
先写个交换函数:
void swap(SqList &L, int low, int high){
RedType temp;
temp = L.r[low];
L.r[low] = L.r[high];
L.r[high] = temp;
}
无哨兵,即不记录枢轴关键字的单次快排:
int Partition(SqList &L, int low, int high){
int pivotkey = L.r[low].key;
while(low<high){
while(low<high&&L.r[high].key>=pivotkey) --high;
swap(L,low,high);
while(low<high&&L.r[low].key<=pivotkey) ++low;
swap(L,low,high);
}
return low; //return high;都可以,low=high
}
有哨兵,使用子表的第一个记录作枢轴记录(即r[0])的单次快排:
int Partition(SqList &L, int low, int high){
L.r[0] = L.r[low];
int pivotkey = L.r[low].key;
while(low<high){
while(low<high&&L.r[high].key>=pivotkey) --high;
L.r[low] = L.r[high];
while(low<high&&L.r[low].key<=pivotkey) ++low;
L.r[high] = L.r[low];
}
L.r[low] = L.r[0];
return low; //返回枢轴位置
}
完整的快速排序算法:
void QSort(SqList &L, int low, int high)
{
int pivotloc;
if(low<high){
pivotloc = Partition(L, low, high);
QSort(L, low, pivotloc-1);
QSort(L, pivotloc+1, high);
}
}
此种快速排序还是挺灵活的,可以随意对记录中任何一段进行排序。
完善中。。。