排序算法学习之快速排序的思路与实现

核心思想

先选取一个数字作为基准数,然后进行分类操作,将比基准数小的放到基准数的前两,比基准数大的放到基础数的后面。

  • 划分问题:将数组的各个元素重排后分成左、右两个部分,使得左边的任意元素都小于或等于右边的任意元素。是按照值进行划分。

  • 递归求解:把左右两部分,分别排序

    在快速排序中,算法的主要工作在于划分阶段,而不需要再去合并子问题的解了。它和归并的区别在于,归并需要将两个部分和明后,才能保证,整体有序,而快速排序的子部分有序后,整体就自然有序了。

基准数的选取

选取标准有很多,有选取第一个数作的,有将中间的数,也有随机进行的。

  • 随机快速排序,使用随机的元素作为中轴
  • 三平均划分法,以数组最左边、最右边和最中间的元素的中位数作为中轴
  • 当子数组足够小是(5~15),改用插入排序方法
  • 一些划分方法的改进。三路划分,将数组分成三段,每段的元素分别小于,等于,大于中轴元素。

如何实现分类

附设两个指针i和j,它们的初值分别是l和r,设枢轴记录取mid,则首先从j所指位置起向前搜索找到第一个关键字小于mid的记录,然后从i所指位置起向后搜索,找到第一个关键字大于mid的记录,将它们互相互换,重复这两步直至i>j为止。

void qSort(int l,int r)
{
    int i,j,mid,p;
    i=l;j=r;
    mid=a[(l+r)/2];// 定义分隔数
    do{
        while(a[i]<mid)i++;//在左侧寻找比中间数大的
        while(a[j]>mid)j--;//在右侧寻找比中间数小的
        
        if(i<=j)
        {
            swap(a[i],a[j]);
            i++;j--;
        }
    }while(i<=j);
    
    if(l<j) qSort(l,j);
    if(i<r) qSort(i,r);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值