排序(7)--快速排序

一、基本快速排序

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; //返回枢轴所在的位置
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值