【排序】快排---前后指针快排序

3.前后指针快排序

int partsort3(int *a, int begin, int end)
{
    int key = begin;
    int prev, cur;
    prev = begin;
    cur = begin + 1;
    while (cur <= end)
    {
        if (a[cur] < a[key] && ++prev != cur)
        {
            Swap(&a[cur], &a[prev]);
        }

        cur++;
    }
    Swap(&a[key], &a[prev]);
    key = prev;
    return key;
}
void quicksort(int *a, int begin, int end)
{
    if (begin >= end)
    {
        return;
    }
    int key = partsort3(a, begin, end);
    quicksort(a, begin, key - 1);
    quicksort(a, key + 1, end);
}

例如 6,1,2,7,9,3,4,5,10,8

初始时
prev指向6,cur指向1,key指向6
cur的数比key的数小,prev往后移动一个位置
在这里插入图片描述

因为此时prev与cur位置相同,不做操作。

在这里插入图片描述

cur接着往后走一步,指向2比6小,所以prev也往后走一步,此时cur和prev仍然指向同一位置,不做操作。
在这里插入图片描述

cur接着往后走,此时cur指向7比6大,prev原地不动。
在这里插入图片描述

cur继续往后走,此时cur指向9比6大,prev原地不动。
在这里插入图片描述

cur继续往后走,此时cur指向3比6小,prev往后走一步,由于cur和prev位置不同,所以进行数字交换。
在这里插入图片描述

交换后,此时prev指向的是3,cur指向的是7
在这里插入图片描述

接着cur继续往后走,此时cur指向4小于6,prev往后也走一步,cur与prev位置不同,进行数字交换

在这里插入图片描述

在这里插入图片描述

交换后,cur继续往后走,此时指向5小于6,prev往后走一步,进行两数交换。

在这里插入图片描述

在这里插入图片描述

交换后cur继续往后走,由于后面的数都比6大,所以当cur离开此数组时,prev仍然指向5。

在这里插入图片描述

在这里插入图片描述

当cur离开时,此时交换prev与key位置上的数

在这里插入图片描述

此时结果如下,prev指向的是6。
在这里插入图片描述

此时即完成了一次排序并放回prev的下标,接着利用递归,分别对5,1,2,3,4和9,7,10,8重复上述方法对排序。
最终结果即为升序。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值