一、基本快速排序
1、快速排序本质上是冒泡排序的升级版,都属于交换排序;它的实现是增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,将关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动交换次数。
2、快速排序的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的小,则可对这两部分记录进行排序,以达到整个序列有序的目的。
3、代码
3.1 对顺序表L作快速排序
void quick_sort(SqList *L)
{
QuickSort(L,1,L->length);
}
3.2 对顺序表L中的子序列L->array[low...high]作快速排序
void QuickSort(SqList *L,int low,int high)
{
int pivot;//枢轴
if(low<high){
pivot=parttion(L,low,high); //算出枢轴值,将L->array[low...high]一分为二
QuickSort(L,low,pivot-1); //对小关键字字表递归排序
QuickSort(L,pivot+1,high); //对大关键字字表递归排序
}
}
3.3 交换顺序表L中子表的记录,使枢轴记录到位,并返回其所在位置,使枢轴两侧的记录的关键字均大于/小于它
int partition(SqList *L,int low,int high)
{
int pivotkey=L->array[low];//用子表的第一个记录做枢轴
while(low<high){ //从表的两端交替向中间扫描
while(low < high && L->array[high] >= pivotkey){
high--; //从高向低扫描
}
swap(L,low,high); //将比枢轴小的记录交换到低端
while(low < high && L->array[low] <= pivotkey){
low++; //从低向高扫描
}
swap(L,low,high); //将比枢轴大的记录交换到高端
}
return low; //返回枢轴所在的位置
}