大家好,今天给各位分享C++ 选择排序、冒泡排序、插入排序和计数排序的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
排序算法稳定性
假设待排序的记录序列中有多个关键字相同的记录。如果排序后这些记录的相对顺序保持不变,那么这种排序算法称为稳定的;否则称为不稳定。稳定的。
稳定排序可以利用上次排序的结果来服务本次排序。
判断方法:排序时是否只交换相邻元素。如果是,则排序算法稳定;如果不是,则排序算法不稳定。
例题:朴素排序模版
选择排序
选择排序:每遍从待排序的数据元素中选择最小(或最大)的元素,并将其放在待排序数组的前面。
时间复杂度:O(n^2),辅助空间复杂度:O(1),不稳定。
#include iostream 使用命名空间std; int n;int a[110];int main(){cin n; for(int i=1; i=n; i++) cin a[i]; //n – 1 轮循环for(int i=1; i n; i++){ int idx=-1, minv=1e9; for(int j=i + 1; j=n; j++){ if(a[j] a[i] a[ j] minv){ minv=a[j]; } idx=j; if(idx !=-1) 交换(a[i], a[idx]); } for(int i=1; i=n ; i++) cout a[i] ‘ ‘;return 0;}
冒泡排序
冒泡排序:按顺序比较两个相邻元素,如果顺序错误则交换它们。每次冒泡时,最大(最小)的元素都会通过交换“漂浮”到序列的顶部。多次冒泡后即可完成排序。
时间复杂度:O(n^2),辅助空间复杂度:O(1),稳定。
冒泡排序—— 普通版
#include iostream 使用命名空间std; int n;int a[110];int main(){cin n; for(int i=1; i=n; i++) cin a[i]; for(int i=1; i n; i++){for(int j=1; j n; j++){ if(a[j] a[j + 1]) 交换(a[j], a[j + 1] ); } } for(int i=1; i=n; i++) cout a[i] ‘ ‘;return 0;}
冒泡排序优化——提前跳出
如果序列已经有序,则无需执行后续循环。
#include iostream 使用命名空间std; int n;int a[110];int main(){cin n; for(int i=1; i=n; i++) cin a[i]; for(int i=1; i n; i++){ bool flag=true;for(int j=1; j=n – i; j++){ if(a[j] a[j + 1]){ 交换(a [j], a[j + 1]);标志=假; if(flag) 中断; } for(int i=1; i=n; i++) cout a[i] ‘ ‘;return 0;}
插入排序
插入排序: 假设前面的n-1 个数字已经有序。现在将第n个数插入到先前已排序的序列中,使得插入后序列仍然是有序的。
时间复杂度:O(n^2),辅助空间复杂度:O(1),稳定。
选项1:
#include iostreamusing namespace std;int n;int a[110];int main() {cin n;for (int i=1; i=n; i++) cin a[i];//插入排序for (int i=2; i=n; i++) {int t=a[i];int k=1;while (a[k]=t k i) k++;for (int j=i; j k; j–) a[j ]=a[j – 1];a[k]=t;}for (int i=1; i=n; i++) cout a[i] ‘ ‘;return 0;}选项2:
#include iostreamusing namespace std;int n;int a[110];int main() {cin n;for (int i=1; i=n; i++) cin a[i];//插入排序for (int i=2; i=n; i++) {int j=i; while(j a[j] a[j – 1]){ 交换(a[j], a[j – 1]); j——; }} for (int i=1; i=n; i++) cout a[i] ‘ ‘;return 0;}
桶排序
桶排序:将数据分成有限个有序的桶,对每个桶分别进行排序,最后合并各个桶中的数据。
数据分布到桶中:哈希过程
计数排序
计数排序:是一种特殊的桶排序。桶的数量是可能的数据类型的数量。
计数数组:数组下标是桶号,通常是一个数据值,
数组的值代表数据的数量。
适用条件:待排序的数据为整数且数据范围有限。
设数据个数为n,数据范围为k。
时间复杂度:O(n+k),附加空间复杂度:O(k),稳定。
构造计数数组
最终数组:
至此排序已经完成,但是还不稳定。
构造prefix 和cnts 数组:
结果数组为results: results[–cnts[a[i]]]=a[i];
#include iostreamusing 命名空间std;const int N=1010;int n;int a[N], cnts[N], results[N];int main() { cin n;for (int i=0; i n; i++) {cin a[i];cnts[a[i]]++;}for (int i=0; i N; i++)cnts[i+1] +=cnts[i];//为了稳定排序,从后向和前向遍历for (int i=n – 1; i=0; i–) {results[–cnts[a[i]]]=a[i];}for (int i=0 ; i++)计算结果[i] ‘ ‘; return 0;}
稳定排序库函数
排序是一种不稳定排序,时间复杂度为O(nlogn)。
stable_sort是稳定排序,其时间复杂度也是O(nlogn)。
stable_sort(起始元素指针,最后一个元素指针之后的位置,比较函数); //对数组a从下标1到n进行排序stable_sort(a+1, a+1+n, cmp);比较函数:传入两个数组中元素类型的参数,返回第一个参数排在前面的情况。
如果不写比较函数cmp,默认是升序排序。
binary_search
在有序序列中,可以用二分法来查找某个元素是否存在。
binary_search(起始位置、结束位置、要查找的元素)。 //二分查找某个元素,时间复杂度为O(logN)。如果在范围内找到值,则返回true,否则返回false。
疯狂刷题
P630车厢重组
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/123913.html
用户评论
咆哮
每次做算法题都选 C语言是因为简单易用,可这篇文章把 C++ 的这些排序提到来了,让我对它有了更多期待!
有7位网友表示赞同!
一尾流莺
感觉这篇博文写的挺深入浅出,把我之前一直混淆的选择排序和冒泡排序搞懂了!关键是还比较详细的讲解了计数排序的使用场景,太赞了~
有18位网友表示赞同!
肆忌
排序算法这个东西学下来确实很有用。选排序效率好像不太高?我平常都习惯用 C++ 的自带排序函数了, 省事啊!
有14位网友表示赞同!
娇眉恨
插入排序适用于已部分有序的数据集? 这点我以前都没注意到!博主分享的知识真滴丰富,让我受益匪浅!
有5位网友表示赞同!
矜暮
选排序和冒泡排序真的都是常考基本算法呀,经常在笔试面试中用到。这篇文章回顾了下这些算法,确实很有帮助!
有18位网友表示赞同!
空谷幽兰
感觉计数排序的适用场景很有限啊,除非数据范围特别小的时候,好像不太常见吧?我平时做项目都用快排或者堆排效率高很多!
有10位网友表示赞同!
莫名的青春
讲真,这些排序算法都是比较基础的了,对于实际项目开发来说,很少会用到这种裸式的排序方法吧?更建议大家学习一下一些更高效的排序算法,比如红黑树啊什么的…
有12位网友表示赞同!
你tm的滚
这篇博文详细讲解了 C++ 中常用的排序算法,无论是概念理解还是代码实现都比较清晰易懂,推荐给所有想深入了解排序算法的朋友!
有20位网友表示赞同!
枫无痕
每次讲到这些排序算法的时候我都会想起算法课上的老师… 哎,希望这次重新温习一下能学得更好点!
有14位网友表示赞同!
ok绷遮不住我颓废的伤あ
选排序和冒泡排序的时间复杂度虽然比较低,但是效率确实不高啊,在实际项目中不太建议使用。计数排序是特别针对数字排序设计的,需要认真理解它的适用场景才能用得好!
有7位网友表示赞同!
海盟山誓总是赊
C++ 中的选择排序、冒泡排序和平局排序都比较简单易学。博文内容还是挺全面,图示讲解也清晰易懂,比单纯看书的好很多!
有14位网友表示赞同!
眉黛如画
感觉这个博客写的真好,我之前对这些排序算法只停留在概念阶段,看完这篇博文我觉得我能理解它们的工作原理了!
有16位网友表示赞同!
搞搞嗎妹妹
C++ 中的选择排序、冒泡排序和插入排序都比较经典的排序算法,这篇文章解释得非常详细清楚,帮助我更好地理解它们的优缺点及适用场景!
有11位网友表示赞同!
病房
对排序算法的了解确实很重要。这篇博文讲解得很深入,让我不仅学会了 C++ 中常见的几种排序算法,还增强了对它们原理的理解!
有19位网友表示赞同!
强辩
看了博文的代码实现,感觉这些排序算法写的都比较简明扼要,易于理解和记忆!值得收藏!
有9位网友表示赞同!
封心锁爱
这篇博客对 C++ 里的各种排序算法进行了全方位讲解,无论是基础概念还是代码实例都做得非常详细,非常适合初学者学习!
有10位网友表示赞同!
终究会走-
博主介绍的计数排序方法还真是挺新奇的,感觉很实用啊~有机会要试试看
有19位网友表示赞同!
凉笙墨染
对于实际开发来说,我建议大家更关注高效率的排序算法,比如二叉树排序和堆排序之类的,学习这些算法能够帮助你更好地解决复杂的任务!
有16位网友表示赞同!