C++基础算法教程|数据排序(3)

欢迎来到沾花把玖的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;
}

本文内容为小编自己汇总,内容可能会有错误或疏漏,感谢大家的提议!

记得点赞和关注哦~

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值