【算法】Python & C++实现排序算法(一)之冒泡排序

1、冒泡排序定义
冒泡排序属于交换排序,其基本思路为:两两比较相邻的数据大小并按照需求交换顺序,知道不存在反序为止。最快:已经是一正序数列;最慢:已经为一全反序数列。时间复杂度为:n~n^2间。【非标准冒泡,标准冒泡,冒泡优化

2、非标准冒泡
对于一个数列,非标准冒泡就是一种交换算法,即是不太严格准从两两相邻比较这一规则,而是例如【7,3,4,9,1】固定一个分别与剩下的数值比较,取得最小或最大,然后开始下一轮。
【7,3,4,9,1】》【3,7,4,9,1】》【1,7,4,9,3】
在这里插入图片描述

3、标准冒泡
通过两两比较使得小的上升效果,具体为:【7,3,4,9,1】》【7,3,4,1,9】》【7,3,1,4,9】》【7,1,3,4,9】》【1,7,3,4,9】,同理后面则是同样重复此过程,而1重最后变为最前就如一个气泡在水中上浮的过程。
在这里插入图片描述

4、冒泡优化
但是标准冒泡还是又缺点,缺点就是对于如这样的数列排序【2,1,3,4,5】对于【3,4,5】这样的正序部分在进行冒泡就有点没有意义了。因此需要改进,对于这样的之关系前面的【2,1】即可。

具体代码

/*
作者:kimicr
时间:20200327
功能:冒泡排序算法
特点:稳定且时间复杂度【n~ n^2】
*/

#include"iostream"
using namespace std;

void SWAP(int *array, int i, int j)
{
	int temp;
	temp = array[i];
	array[i] = array[j];
	array[j] = temp;
}

//非标准冒泡
void BubbleSort1(int *array, int length)  //数组名与长度
{
	if (length <= 1) return;
	for (int i = 0; i < length-1; i++)
	{
		for (int j = i + 1; j < length; j++)
		{
			if (array[j] < array[i])
				SWAP(array, i, j);
		}
	}
}

//标准冒泡
void BubbleSort2(int *array, int length)
{
	if (length <= 1) return;
	for (int i = 0; i < length; i++)
	{
		for (int j = length - 1; j>=i; j--)
		{
			if (array[j] < array[j - 1])
				SWAP(array, j, j - 1);
		}
	}
}

//冒泡优化
void BubbleSort3(int *array, int length)
{
	if (length <= 1) return;
	bool flage = true;
	for (int i = 0; i < length && flage; i++)
	{
		flage = false;
		for (int j = length - 1; j >= i; j--)
		{
			if (array[j] < array[j - 1])
				SWAP(array, j, j - 1);
		}
	}
}
int main()
{
	//int a[10] ={2,1,3,4,5,6,7,8,9};
	int a[10] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
	BubbleSort1(a, 10);
	//BubbleSort2(a,10);
	//BubbleSort3(a,10);
	for (int i = 0; i < 10; i++)
		cout << a[i] << " ";
	cout << endl;
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值