C++快速排序之整型数组

开头:

        最近遇到oj上关于排序的题目。选择排序,冒泡排序以及冒泡排序优化都无法accepted,后来知道了sort()函数(头文件是#include<algorithm>)或者手写快速排序可以解决。

        sort(起始地址,结束地址,比较器),比如数组的排序就是sort(arr, arr+10)这样。

        网上介绍快排的文章很多了,我这篇文章的受众是像我一样的C++初学者,相关知识点在注释中已经写的很清楚,可以让你省下2小时的检索时间,看这一篇就可以了。

先放代码:

        首先构造函数,参数是两个整型,一个整型数组。值传递是因为外界把数据传到函数内部,如果需要函数内部的数据传到主函数,才需要引用传递(变量前加这个&,比如int &left)

        然后就是一些细节,下面代码注释里都有

        最后主函数那里调用函数,Quick_sort()里,数组只有声明时才必须带长度,此处不用,所以是arr而不是arr[]

#include<iostream>
using namespace std;

void Quick_sort(int left, int right, int arr[])
{
    if(left >= right)
        return;//终止条件,左边界下标大于等于右边界,
               //说明当前数组长度是1或该数组物理不存在,这里是递归出口
    int i, j, base, temp;
    i = left, j = right;//根据传入的左右边界声明两个游标
    base = arr[left];//指定好基数
    while(i < j)//说明二者没相遇,循环继续执行
    {
        while(arr[j] >= base && i < j)
            j--;//j游标先行,只要j游标指向的数值大于基数,j游标就继续移动
        while(arr[i] <= base && i < j)
            i++;//i游标后走,只要i游标指向的数值小于基数,i游标就继续移动
        if(i < j)
        {//退出上面两个循环后,说明i指向了大于基数的元素,j指向了小于基数的元素
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;//i,j指向的数值交换
        }
    }
    arr[left] = arr[j];//因为j先行,此时i,j指向的相同元素,必然比基数小
    arr[j] = base;//所以与左端基数交换
    Quick_sort(left,i-1,arr);//递归处理当前两个游标左边无序数组
    Quick_sort(i+1,right,arr);//递归处理当前两个游标右边无序数组
}

int main()
{
    int n;
    while(cin>>n)
    {
        int arr[n];//数组初始化必须指定长度,且长度为常量,
                   //不指定长度或长度为变量,都会编译出错
        for(int i = 0; i < n; i++)
            cin>>arr[i];
    //strlen()只是求字符串长度,求不了字符数组和整型数组长度
        Quick_sort(0, n - 1, arr);
        for(int i = 0; i < n; i++)//老把for写成while
            cout<<arr[i]<<" ";
    }//第一个应该把全部包起来

    return 0;
}

题目要求输入一个整型n,代表整型数组长度,然后输入序列,最后输出从小到大排列的序列。 

以下是输入输出: 

再放图片:

每一次相遇,意味着,相遇点的左边都比它小,相遇点的右边,都比它大

 由上述代码,j先移动

当i指向的7大于基数6,j指向的5小于基数6,i,j指向的数值交换

9 > 6, 4 < 6,所以4,6交换 

最后相遇于3这个数字,所以3与左端的6交换,此时6左边的数字均小于6,右边的数字都大于6,完成第一次调用,后续再分别对左右递归就行,直至终止条件满足。

总结:

        还是要多点敲,快速排序这个我敲到第三遍才能不看别人的代码,一次Accepted,至少考试时能敲出来了。学一门编程语言,一万行就入门了,每天100行,三个月。

学习经验:

        0基础的话,我现在除了完成学校作业,还有就是

oj网

以及力扣算法网

刷一些简单的题目,先打好基础把,为三年后校招以及投简历准备

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千帐灯无此声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值