C++ 选择排序、冒泡排序、插入排序和计数排序

什么是排序算法?排序算法是一种用于将一组元素按照一定顺序排列的算法。这种排序可以按照升序(从小到大)或降序(从大到小)的方式进行。排序算法是计算机科学中的基本问

大家好,今天给各位分享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;}

插入排序

C++ 选择排序、冒泡排序、插入排序和计数排序

插入排序: 假设前面的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),稳定。

构造计数数组

C++ 选择排序、冒泡排序、插入排序和计数排序

最终数组:

至此排序已经完成,但是还不稳定。

构造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车厢重组

用户评论

C++ 选择排序、冒泡排序、插入排序和计数排序
咆哮

每次做算法题都选 C语言是因为简单易用,可这篇文章把 C++ 的这些排序提到来了,让我对它有了更多期待!

    有7位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
一尾流莺

感觉这篇博文写的挺深入浅出,把我之前一直混淆的选择排序和冒泡排序搞懂了!关键是还比较详细的讲解了计数排序的使用场景,太赞了~

    有18位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
肆忌

排序算法这个东西学下来确实很有用。选排序效率好像不太高?我平常都习惯用 C++ 的自带排序函数了, 省事啊!

    有14位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
娇眉恨

插入排序适用于已部分有序的数据集? 这点我以前都没注意到!博主分享的知识真滴丰富,让我受益匪浅!

    有5位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
矜暮

选排序和冒泡排序真的都是常考基本算法呀,经常在笔试面试中用到。这篇文章回顾了下这些算法,确实很有帮助!

    有18位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
空谷幽兰

感觉计数排序的适用场景很有限啊,除非数据范围特别小的时候,好像不太常见吧?我平时做项目都用快排或者堆排效率高很多!

    有10位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
莫名的青春

讲真,这些排序算法都是比较基础的了,对于实际项目开发来说,很少会用到这种裸式的排序方法吧?更建议大家学习一下一些更高效的排序算法,比如红黑树啊什么的…

    有12位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
你tm的滚

这篇博文详细讲解了 C++ 中常用的排序算法,无论是概念理解还是代码实现都比较清晰易懂,推荐给所有想深入了解排序算法的朋友!

    有20位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
枫无痕

每次讲到这些排序算法的时候我都会想起算法课上的老师… 哎,希望这次重新温习一下能学得更好点!

    有14位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
ok绷遮不住我颓废的伤あ

选排序和冒泡排序的时间复杂度虽然比较低,但是效率确实不高啊,在实际项目中不太建议使用。计数排序是特别针对数字排序设计的,需要认真理解它的适用场景才能用得好!

    有7位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
海盟山誓总是赊

C++ 中的选择排序、冒泡排序和平局排序都比较简单易学。博文内容还是挺全面,图示讲解也清晰易懂,比单纯看书的好很多!

    有14位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
眉黛如画

感觉这个博客写的真好,我之前对这些排序算法只停留在概念阶段,看完这篇博文我觉得我能理解它们的工作原理了!

    有16位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
搞搞嗎妹妹

C++ 中的选择排序、冒泡排序和插入排序都比较经典的排序算法,这篇文章解释得非常详细清楚,帮助我更好地理解它们的优缺点及适用场景!

    有11位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
病房

对排序算法的了解确实很重要。这篇博文讲解得很深入,让我不仅学会了 C++ 中常见的几种排序算法,还增强了对它们原理的理解!

    有19位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
强辩

看了博文的代码实现,感觉这些排序算法写的都比较简明扼要,易于理解和记忆!值得收藏!

    有9位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
封心锁爱

这篇博客对 C++ 里的各种排序算法进行了全方位讲解,无论是基础概念还是代码实例都做得非常详细,非常适合初学者学习!

    有10位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
终究会走-

博主介绍的计数排序方法还真是挺新奇的,感觉很实用啊~有机会要试试看

    有19位网友表示赞同!

C++ 选择排序、冒泡排序、插入排序和计数排序
凉笙墨染

对于实际开发来说,我建议大家更关注高效率的排序算法,比如二叉树排序和堆排序之类的,学习这些算法能够帮助你更好地解决复杂的任务!

    有16位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/123913.html

(0)
小su's avatar小su
上一篇 2024年9月1日 下午6:00
下一篇 2024年9月1日 下午6:04

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注