开头:
最近遇到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网
以及力扣算法网
刷一些简单的题目,先打好基础把,为三年后校招以及投简历准备
2561

被折叠的 条评论
为什么被折叠?



