冒泡排序简单

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);
}

以上就是冒泡排序的全部内容,大家要多加练习,不要抄代码和题解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值