剑指Offer-快速排序

剑指Offer上的快速排序的Partition函数与我在数据结构书上学到的不一样,因此就想要探索下这两种不同的处理方式。文章目录1.基本思想2.剑指Offer上的Partition实现3.一般教材上的Partition实现4.总结1.基本思想快速排序的基本思想是基于分治法。在待排序表L[1…n]中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1…k-1]和L[...
摘要由CSDN通过智能技术生成

剑指Offer上的快速排序的Partition函数与我在数据结构书上学到的不一样,因此就想要探索下这两种不同的处理方式。

1.基本思想

快速排序的基本思想是基于分治法。在待排序表L[1…n]中任取一个元素pivot作为基准,通过一趟排序将待排序表划分为独立的两部分L[1…k-1]和L[k+1…n],使得L[1…k-1]中所有元素小于pivot,L[k+1…n]中所有元素大于或等于pivot,则pivot放在了其最终位置L(k)上。而后递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。

2.剑指Offer上的Partition实现

// Partition为分割函数, length表示data数组的长度
int Partition(int data[], int length, int low, int high) {
   
    if (data == nullptr || length <= 0 || low < 0 || high >= length) {
   
        return 1;
    }
    
    // 在[low, high]区间中随机取一个基准值,并将其换到区间最末尾
    int index = RandomInRange(low, high);
    Swap(&data[index], &data[high]);
    
    // small在low的前面一位
    int small = low - 1;
       
    for (index = low; index < high; ++index) {
   
        if (data[index] < data[high]) {
   
            // ++small后表示大于基准值的第一个数的下标
            // 如果不存在大于基准值的数,则表示当前比较的数字下标
            ++small;

            // 交换后的small表示小于基准值的最后一个数字的下标
            if (small != index) {
   
                Swap(&data[index], &data[small
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值