c++经典排序之冒泡排序算法

本文详细介绍了C++中冒泡排序算法的实现过程,包括基本算法的演示及优化后的代码示例,展示了如何通过增加标志位提前结束排序,避免不必要的遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++冒泡排序算法实现

冒泡排序,是一种计算机科学领域的较简单的排序算法。它通过遍历要排序的元素,依次比较相邻元素的大小,如果前面的元素大于后面的元素,则交换两个元素的位置。因此,在第一趟遍历完成时,会把最大的元素排在最末尾,第二趟遍历完成时,会把次大的元素排在倒数第二位,依次类推直到要排序的元素以升序的方式排列。由于该过程类似于鱼吐的泡泡一样向上浮,所以冒泡排序也由此得名。
接下来来看一下c++如何实现冒泡排序的。

#include <iostream>
using namespace std;
int main()
{
	int a[10] = {2,11,4,1,5,18,13,10,15,8};
	cout << "数组中的数分别是:";
	for(int i = 0;i<10;i++)
		cout << a[i] << " ";
	cout << endl;
	for(int i = 0;i<9;i++)
	{
		for(int j = 0;j<9-i;j++)
		{
			int temp = 0;		
			if(a[j]>a[j+1])//如果前面的元素大于后面的元素,则交换位置
			{
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
			}
		}
		cout << "第" << i << "轮排序之后:";
		for(int k =0;k<10;k++)
		{
			cout << a[k] << " ";
		}
		cout << endl;
	}
	cout << "排序之后数组如下:";
	for(int i = 0;i<10;i++)
		cout << a[i] << " ";
	cout << endl;
	return 0;
}

运行代码,结果如下:
在这里插入图片描述
从排序的结果可以看出,从最大数,次大数…等会依次被放置在正确的位置上。当然再仔细观察一下,可以看出在第4(从0开始算)轮排序之后,所有的数据都已经被排好序了,所以第4轮之后的所有排序都是无用功。因此这里可以想一下,是否可以判断数据有序时,提前结束排序呢?这种判断的依据是什么呢?
很显然,当某一轮遍历完成时,没有进行交换数据位置的操作,就可以说明数据是有序的。因此可以增加一个标志位,来记录是否有进行数据交换。改进的冒泡排序具体实现如下:

#include <iostream>
using namespace std;
int main()
{
	bool flag = false; 
	int a[10] = {2,11,4,1,5,18,13,10,15,8};
	cout << "数组中的数分别是:";
	for(int i = 0;i<10;i++)
		cout << a[i] << " ";
	cout << endl;
	for(int i = 0;i<9&&!flag;i++)
	{
		flag = true;
		for(int j = 0;j<9-i;j++)
		{
			int temp = 0;		
			if(a[j]>a[j+1])
			{
				temp = a[j];
				a[j] = a[j+1];
				a[j+1] = temp;
				flag = false;
			}
		}
		cout << "第" << i << "轮排序之后:";
		for(int k =0;k<10;k++)
		{
			cout << a[k] << " ";
		}
		cout << endl;
	}
	cout << "排序之后数组如下:";
	for(int i = 0;i<10;i++)
		cout << a[i] << " ";
	cout << endl;
	return 0;
}
	运行代码,结果如下:

在这里插入图片描述
在第四轮排序之后可以看到数据已经有序了,再进行第五轮遍历时,没有进行交换数据的操作,所以设定的flag = true,此时再进行i<9&&!flag的判断时,条件不成立,可以提前结束排序,以免再有多余的遍历和比较的过程。
感兴趣的朋友们可以关注我,一起学习C++吧!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值