欢迎来到沾花把玖的C++算法课堂!
数据排序——冒泡排序
1.基本思想:
以n个人站队为例,从第1个开始,依次比较相邻的两个是否逆序对(高在前,矮在后),若逆序就交换这两人,即第1个和第2个比,若逆序就交换这两人,即第2个和第3个比,若逆序就交换这两人,即第3个和第4个比,......,直到n-1和n比较,经过一轮比较后,则把最高的人排到最后,即将最高的人像冒泡一样逐步冒到相应的位置。原n个人的排序问题,转换为n-1个人的排序问题。第二轮比较以此类推,直到进行n-1轮比较后,队列为有序队列。
2.动图演示:
3.代码:
void BubbleSort(int *a,int n){
int end=0;
for (end=n-1;end>=0;end--){
int exchange=0; //记录该趟冒泡排序是否进行过交换
int i=0;
for(i=0;i<end;i++){
if(a[i]>a[i+1]){
Swap(&a[i],&a[i+1]);
exchange=1;
}
}
if(exchange==0)break; //该趟冒泡排序没有进行过交换,已有序
}
}
例题:
【题目描述】
输入n个数,将这n个数从小到大输出(n<=10000)。
【样例输入】
6
6 5 3 4 1 2
【样例输出】
1 2 3 4 5 6
【分析】
当n=6时,数组a中的6个元素是:6,5,3,4,1,2。执行插入排序程序后,其数据变动情况:
第1轮:
[5 6] 3 4 1 2
5 [3 6] 4 1 2
5 3 [4 6] 1 2
5 3 4 [1 6] 2
5 3 4 1 [2 6]
第1轮结束,6固定下来
第2轮:
[3 5] 4 1 2 6
3 [4 5] 1 2 6
3 4 [1 5] 2 6
3 4 1 [2 5] 6
第2轮结束,5固定下来
第3轮:
[3 4] 1 2 5 6
3 [1 4] 2 5 6
3 1 [2 4] 5 6
第3轮结束,4固定下来
第4轮:
[1 3] 2 4 5 6
1 [2 3] 4 5 6
第4轮结束,3固定下来
第5轮:
[1 2] 3 4 5 6
第5轮结束,2固定下来
排序结束!
以下是代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10010;
int main(){
int n,i,j;
double temp,a[MAXN];
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=n;i>1;i--){ //进行n-1轮冒泡
for(j=1;j<i;j++){ //每轮进行i次的比较
if(a[j]>a[j+1]) //相邻两个元素比较,若逆序就交换
swap(a[j],a[j+1]); //交换
}
}
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
本文内容为小编自己汇总,内容可能会有错误或疏漏,感谢大家的提议!
记得点赞和关注哦~