冒泡排序及优化

冒泡排序

冒泡排序是指依次比较两个相邻的数,如果顺序错误就把他们交换过来,直到没有相邻的数需要交换,也就是说该数列已经排序完成

如图:

举个例子:

像上图这样,每两个数为一组,按序判断完所有组后叫做一轮。大多数数据需要多轮才能完成排序,如上图4和3的位置的是错误的

每完成一轮排序,就能确定至少一个数的正确位置,如7,就被移到了最大的位置

如果我们设数的总数为n,那么组数就为n-1(第一个不用和它前面的排序,最后一个不用和它后面的排序,因此就少一组)

而排序所需的最少轮数也为n-1。因为每轮排序都能排好一个数,而最后的一次排序会直接确定两个数的位置,所以为n-1

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,a[20];//假设总数不超过20 
	cin>>n;//输入总数 
	for(int i=1;i<=n;i++)cin>>a[i];//输入数列 
	for(int i=1;i<=n-1;i++)//枚举轮数 
	{
		for(int j=1;j<=n-1;j++)//枚举组数 
		{
			if(a[j]>a[j+1])swap(a[j],a[j+1]);//如果前比后大,交换两数(从小打到大排序) 
		}
	}
	return 0;
}

如果要写从大到小排序的,只要更改判断里的符号就可以了

优化

既然每轮都能排好一个数,那么下一轮就多一个不用排的数,程序就不必对那些数再进行判断和交换了

也就是说,每当轮数加一时,需要排序的数列的末尾就向前移动一位,这样能省去大约一半的判断

for(int i=1;i<=n-1;i++)//枚举轮数 
	{
		for(int j=1;j<=n-i;j++)//枚举组数,优化时直接减去轮数即可,因为轮数等于已排好的数
		{
			if(a[j]>a[j+1])swap(a[j],a[j+1]);//如果前比后大,交换两数(从小打到大排序) 
		}
	}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值