1.冒泡排序
冒泡排序的思想:以n个人战队为例,从第1个开始,依次比较相邻的两个是否能逆序对(高在前,矮在后),若逆序就交换这两人,即第1个和第2个比,若逆序就交换两人,接着第2个和第3个比,若逆序就交换两人,接着第3个和第4个比,若逆序就交换两人,……,直到n-1和n比较,经过一轮比较后,则把最高的人排在最后,即将最高的人像冒泡一样逐步冒到相应的位置。原n个人的排序问题,转换为n-1个人的排序问题。第二轮从第1个开始,依次比较相邻的人是否逆序,若逆序就交换两人,直到n-2和n-1比较。如此,进行n-1轮后,队列为有序的队列。
这样讲可能很抽象,给你们演示一下。
例如有6个元素需要排序:
6 5 3 4 1 2
第一趟排序:
5 6 3 4 1 2(5,6交换)
5 3 6 4 1 2(3,6交换)
5 3 4 6 1 2(4,6交换)
5 3 4 1 6 2(1,6交换)
5 3 4 1 2 6(2,6交换)
6固定下来
第二趟排序:
3 5 4 1 2 6(3,5交换)
3 4 5 1 2 6(4,5交换)
3 4 1 5 2 6(1,5交换)
3 4 1 2 5 6(2,5交换)
5固定下来
第三趟排序;
3 1 4 2 5 6(1,4交换)
3 1 2 4 5 6(2,4交换)
4固定下来
第四趟排序:
1 3 2 4 5 6(1,3交换)
1 2 3 4 5 6(2,3交换)
3固定下来
第五趟排序:
1 2 3 4 5 6
2固定下来,1也固定下来,排序完成
那么怎么用代码实现呢:
1.读入数据存放在数组a中。
2.比较相邻的前后两个数据,如果前面数据大于后面的数据,就将两个数据交换
3.对数组的第1个数据到n个数据进行一次遍历后,最大的一个数据就“冒”到数组第n个位置。
4.n=n-1,如果n不为1就重复前面两步,否则排序完成。
接下来就是你们最关心的代码了:
#include <bits/stdc++.h>
using namespace std;
int a[10001];
int b(int data[],int n){
for(int i=1;i<=n-1;i++){
for(int j=1;j<=n-i;j++){
if(data[j]>data[j+1]){//如果是逆序,交换
swap(data[j],data[j+1]);
}
}
}
}
int main(){
int m;
cin >> m;
for(int i=1;i<=m;i++){
cin >> a[i];
}
b(a,m);
}
接下来是1道冒泡排序的题目:
在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 180180 度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。
输入
共两行。
第一行是车厢总数 N(≤10000)。
第二行是N 个不同的数表示初始的车厢顺序。
输出
一个整数,最少的旋转次数。
这题只需要在冒泡排序的时候每交换一次sum++,最后return sum
代码
#include <bits/stdc++.h>
using namespace std;
int a[10001];
int b(int data[],int n){
int sum=0;
for(int i=1;i<=n-1;i++){
for(int j=1;j<=n-i;j++){
if(data[j]>data[j+1]){
swap(data[j],data[j+1]);
sum++;//每交换一次,sum++
}
}
}
return sum;
}
int main(){
int m;
cin >> m;
for(int i=1;i<=m;i++){
cin >> a[i];
}
cout << b(a,m);
}
以上就是冒泡排序的全部内容,大家要多加练习,不要抄代码和题解。