微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【C++】递归之快速排序

递归快速排序的步骤:

(1)选择基准值

(2)将数组分成两个子数组:小于基准值的元素组成的子数组和大于基准值的元素组成的子数组。

(3)对这两个子数组进行快速排序。

C++代码(可在VS直接运行):

#include<iostream>
#include@H_404_13@<vector>
using@H_404_13@ namespace@H_404_13@ std;
vector@H_404_13@<int@H_404_13@> sort_quick_recursive(vector<int@H_404_13@>& data,int@H_404_13@ left,1)">int@H_404_13@ right);
@H_404_13@int@H_404_13@ partition(vector< right);

@H_404_13@ main()
{
    vector@H_404_13@<int@H_404_13@> arr = {0@H_404_13@,5@H_404_13@,1)">1@H_404_13@,1)">3@H_404_13@,1)">9@H_404_13@,1)">2@H_404_13@,1)">6@H_404_13@,1)">7@H_404_13@,1)">8@H_404_13@,1)">4@H_404_13@};
    vector@H_404_13@<int@H_404_13@> result;
    @H_404_13@int@H_404_13@ left = 0@H_404_13@;
    @H_404_13@int@H_404_13@ right = 9@H_404_13@;
    result @H_404_13@= sort_quick_recursive(arr,left,right);
    @H_404_13@for@H_404_13@ (unsigned int@H_404_13@ i = 0@H_404_13@; i < arr.size(); i++)
    {
        cout @H_404_13@<< arr[i] << "@H_404_13@   "@H_404_13@;
    }
    
}

vector@H_404_13@< right)
{
    @H_404_13@//@H_404_13@ 思想:
    @H_404_13@ 在元素序列上直接操作;
    @H_404_13@ 每次在无序序列中选取一个数,一般称之为中轴数,@H_404_13@ 将元素序列分成两个部分,使得一部分的元素全都小于等于另一部分的所有元素;
    @H_404_13@ 也就是说将序列分成小于等于中轴数和大于等于中轴数的两部分,使得中轴数变为有序;
    @H_404_13@ 再递归的对分成的两部分进行划分操作.@H_404_13@

    if@H_404_13@ (left < right)
    {
        @H_404_13@ 找到中轴数的索引.@H_404_13@
        int@H_404_13@ index = partition(data,right);
        @H_404_13@ 以中轴数的索引为界递归处理两个部分的序列.@H_404_13@
        sort_quick_recursive(data,index - 1@H_404_13@);
        sort_quick_recursive(data,index @H_404_13@+ ,right);
    }
    @H_404_13@return@H_404_13@ data;
}

@H_404_13@ 找到中轴数的正确位置,同时将序列划分为两部分.
    @H_404_13@ 中轴数有很多种取法,我们这里采用《算法导论》里的选取方法,即取序列最后一个元素.@H_404_13@
    int@H_404_13@ key = data.at(right);
    @H_404_13@ 此处设置两个索引i和j,区间[left,i]为小于中轴数的序列,1)"> 区间[j,right-1]为大于中轴数的序列.@H_404_13@
    int@H_404_13@ i = left - for@H_404_13@ (int@H_404_13@ j = left; j < right; j++)
    {
        @H_404_13@if@H_404_13@ (data.at(j) <= key)
        {
            @H_404_13@ 大于中轴数的元素让它继续待在[j,right-1]区间什么也不做;
            @H_404_13@ 小于中轴数的元素全部从[j,right-1]区间放到[left,i]区间去.@H_404_13@
            ++i;
            @H_404_13@int@H_404_13@ temp = data.at(i);
            data.at(i) @H_404_13@= data.at(j);
            data.at(j) @H_404_13@= temp;
        }
    }
    @H_404_13@ 此时中轴数的正确位置应该在i+1,将其归位.
    @H_404_13@ 思考为什么是i+1而不是i.@H_404_13@
    int@H_404_13@ temp = data.at(i + );
    data.at(i @H_404_13@+ 1@H_404_13@) = data.at(right);
    data.at(right) @H_404_13@= temp;
    @H_404_13@ 返回中轴数的正确索引.@H_404_13@
    return@H_404_13@ i + ;
}@H_404_13@

 

参考自:https://blog.csdn.net/weixin_39408343/article/details/107086104

这位博主很厉害,总结了十种排序方法,感兴趣的可以去看,再自己运行调试一下~

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐