C/C++ 七大排序算法 之 “冒泡排序”

排序:即将一组混乱的数据按从小到大或者从大到小的顺序进行有序的排列出来。

冒泡排序算法图解:
在这里插入图片描述

思路解答:
从第一个数据开始,与其后一个数据进行比较,如果后面的数据比他小,则它两互相交换位置;然后再从第二个数据开始,与其后一个数据进行比交,如果后面的数据比他小,则它两互相交换位置;然后再从第三个数据开始…;如果有遇到后面的数据比它还要大的,则无需交换。

在这里插入图片描述

时间复杂度:O(n2)


代码实现:

void BubbleSort(int *arr, int len) {
	for (int i = 0; i < len - 1; i++) {	// 操作n-1次
		for (int j = 0; j < len - i - 1; j++) {	// 后面的数据已经排好序,所以需要减去i次
			if (arr[j] > arr[j + 1]) {	// 如果前面的比后面的要大
				int ret = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = ret;
			}
		}
	}
}

上面的代码是实现冒泡算法的一种方式,当然也还有特殊情况下效率高的算法。

例如需要将这一堆数据进行排序:{ 154, 155 , 157, 174, 162, 159, 160, 161, 171 }

深色的表示已经排好序了,后续就不需要再进行比较了!

第一次排序:154, 155, 157, 162, 159, 160, 161, 171, 174
第二次排序:154, 155, 157, 159, 160, 161, 162, 171, 174
第三次排序:154, 155, 157, 159, 160, 161, 162, 171, 174
可以看出,特殊情况,排序两次后就排好序了,所以我们再第三次排序确认没有数据再进行交换后,就说明这一组数据是已经排好序的了,就可以结束循环了!

改进后的冒泡排序算法代码:

void BubbleSort(int* arr, int len) {
	for (int i = 0; i < len - 1; i++) {	// 操作n-1次
		bool sorted = true;	// 假如n次比较后已经排好序,但是他还没有走完循环,可以利用它来结束循环,效率提高
		for (int j = 0; j < len - i - 1; j++) {	// 后面的数据已经排好序,所以需要减去i次
			if (arr[j] > arr[j + 1]) {	// 如果前面的比后面的要大
				int ret = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = ret;

				sorted = false;	// 当有执行交换操作,赋值false
			}
		}

		if (sorted) break;	// 为真时,说明循环一轮后,没有执行交换操作,即已经排好序了,直接结束循环
	}
}

此时,算法效率就大大提高了!!!


全部代码实现:

#include <iostream>
#include <Windows.h>

using namespace std;

void BubbleSort(int* arr, int len) {
	for (int i = 0; i < len - 1; i++) {	// 操作n-1次
		bool sorted = true;	// 假如n次比较后已经排好序,但是他还没有走完循环,可以利用它来结束循环,效率提高
		for (int j = 0; j < len - i - 1; j++) {	// 后面的数据已经排好序,所以需要减去i次
			if (arr[j] > arr[j + 1]) {	// 如果前面的比后面的要大
				int ret = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = ret;

				sorted = false;	// 当有执行交换操作,赋值false
			}
		}

		if (sorted) break;	// 为真时,说明循环一轮后,没有执行交换操作,即已经排好序了,直接结束循环
	}
}


int main(void) {
	int beauties[] = { 154, 155 , 157, 174, 162, 159, 160, 161, 171 };

	// 计算数组的元素个数
	int len = sizeof(beauties) / sizeof(beauties[0]);

	BubbleSort(beauties, len);

	for (int i = 0; i < len; i++) {
		cout << beauties[i] << ", ";
	}
	cout << endl;

	system("pause");
	return 0;
}

运行截图:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值