学习记录贴:1.快速排序算法(简单思路、核心思想及代码)

快速排序算法是一种简单的双指针算法应用

其核心思想是“分治”,再利用递归的方法即可简单完成排序

大致实现步骤为:

        1.首先选取当前“块”([l , r])中的“标兵”数字(a[mid]),以标兵为基准,目的是当前“块”quick_sort后,以“标兵”为分界线,其左边的所有数均小于等于“标兵”,右边的数均大于等于“标兵”。

        2.以“标兵”所在位置序号(mid)为界,将目前“块”([l, r])一分为二(即“分治”)为[l , mid] 和 [mid + 1, r],再分别对两块进行步骤一quick_sort。

        3.设置递归结束条件,当“块”大小为1时,结束递归,返回(即当 l >= r 时,结束递归)。

代码模板:

// 利用分治的思想
// q 是待排序的数组

void quick_sort(int q[], int l, int r){
    if (l >= r) 
        return;  //当区间长度等于 1 时递归结束

    int x = q[(l + r) / 2]; int i = l - 1; int j = r + 1;  //选好标兵, 以及左右起始点
    // x 为选择的标兵 , 这里选择的是每个区间的中间数字
    
    // i , j 是我们设置的双指针
    // 其中 i 从区间的左端开始 , 作用是找到大于等于标兵的数字 , 即不满足排序目的的数字
    // 其中 j 从区间的右端开始 , 作用是找到小于等于标兵的数字 
    // 每次 while 的作用是 , 分别找到标兵两边不满足排序目的的数字 , 并将其交换顺序使得满足条件
    // 循环结束的条件是 i >= j 时循环结束 
    // 即当标兵
    // 左端的所有数字均小于等于标兵 , 且右端的所有数字均大于等于标兵时结束
    while(i < j){
        do i++; while(q[i] < x);    //从左至右遇到第一个大于等于标兵的数时停止
        do j--; while(q[j] > x);    //从右至左遇到第一个小于等于标兵的数时停止
        if (i < j) swap(q[i], q[j]);    //交换两个数的位置
    }
    
    // 接下来细分区间 , 继续分治
    quick_sort(q, l , j);   //继续分治
    quick_sort(q, j + 1, r);    //继续分治
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值