冒泡排序——好邻居比一比
Posted 寸金课堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序——好邻居比一比相关的知识,希望对你有一定的参考价值。
上节课讲的桶排序,我们说最大的问题是浪费空间,举得例子还只是整数,如果是小数,那用桶排序几乎就是崩溃。
这节课我们还讲一个新的排序——冒泡排序,冒泡排序的基本思想是:比较相邻的两个数,如果他们的顺序错误,就交换位置。
还以上节课的例子为例,要将 3,5,2,9,8,3 按从大到小排序,先用3和5比较,3比5小,交换位置,然后再用3和2比,2小,不用动,2再和9比,依此类推,2就被排到了最后,这样我们就找到了最小的一个数,接下来再从头开始进行上述操作,不过这次只需要比较到倒数第二位(因为最后一位已经是最小),直到全部排序完成。下图列出了前两次比较:
明白了原理,来看看代码是怎样实现的:
using namespace std;
int main(){
//成绩数组 ;i,j用于循环
int score[] = {3,5,2,9,8,3},i,j;
//6个数,只需比较5轮
for(i=5;i>0;i--){
//找出每轮中的最小数,想一下为什么只需要找到j<i
for(j=0;j<i;j++){
//如果当前数小于下一个数,就交换
if(score[j]<score[j+1]){
swap(score[j],score[j+1]);
}
}
}
//输出排序后数组
for(i=0;i<=5;i++){
cout<<score[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
另一种循环写法:
for(i=0;i<=5;i++){
for(j=0;j<5-i;j++){
if(score[j]<score[j+1]){
swap(score[j],score[j+1]);
}
}
}
程序执行结果:
扩展:学过结构体的同学,可以构造一个带有姓名和成绩的结构体,通过比较成绩来排序:
using namespace std;
int main(){
//学生结构休,包含姓名和分数
struct students{
char name[20];
int score;
};
//temp 用于比较好临时交换数据
struct students stu[100],temp;
int n,i,j;
cout<<"请输入学生人数:" <<endl;
cin>>n;
//循环读入学生姓名和成绩
cout<<"请输入学生姓名和成绩:" <<endl;
for(i=1;i<=n;i++){
cin>>stu[i].name>>stu[i].score;
}
//排序
for(i=1;i<=n;i++){
for(j=1;j<=n-i;j++){
if(stu[j].score<stu[j+1].score){
//交换数据
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1] = temp;
}
}
}
cout<<"成绩排序后输出:"<<endl;
for(i=1;i<=n;i++){
cout<<stu[i].name<<" "<<stu[i].score<<endl;
}
system("pause");
return 0;
}
程序执行结果:
冒泡排序的核心部分是双重嵌套循环。不难看出冒泡排序的时间复杂度是 O(N*N)。这是 一个非常高的时间复杂度。冒泡排序早在 1956 年就有人开始研究,之后有很多人都尝试过 对冒泡排序进行改进,但结果却令人失望。如 Donald E. Knuth(中文名为高德纳,1974 年 图灵奖获得者)所说:“冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实之外,似乎没有什么值得推荐的。”
那还有没有更好的排序算法呢?请看下节快速排序。
想了解关于程序设计、游戏开发、动画制作等,欢迎来电咨询!
寸金课堂——让学习成为一件有趣的事
长按二维码微信详询
以上是关于冒泡排序——好邻居比一比的主要内容,如果未能解决你的问题,请参考以下文章