三种冒泡排序方法

冒泡排序 BubbleSort :

1.对序列中的数据,依次比较相邻两个元素的大小;
2.如果前边的大于后边的数据,则交换二者;
1.一种交换排序;
序列中每个元素,分别和后边的剩余元素比较,较小的元素冒上去;

算法易懂,但效率极低

2.正宗冒泡排序:
反向,每次从最后一个元素开始,分别和它前边的元素进行比较,较小的冒上去;

j>i,效率提高了;

3.优化的冒泡排序:
增加标记Flag变量,在最外层的循环中设置判断,若Flag为True,则序列已经有序

无需对元素比较判断,退出循环;.

//三种冒泡排序算法比较
#include <iostream>
#include <vector>
#include <ctime>

using namespace std;

void BubbleSortLow(vector <int> chaosData, int num);
void BubbleSortMid(vector <int> chaosData, int num);
void BubbleSortHight(vector <int> chaosData, int num);
int SwapNum(int &num1, int &num2);

int main()
{
	int num = 10;
	srand((unsigned)time(NULL));
	cout << "功能:对数据从大到小排序\n" << endl;
	vector <int> chaosData;
	for (int i = 0; i != num; ++i)
	{
		chaosData.push_back(rand() % 100); //产生0~100的整型数据
	}
	cout << "排序前数据为:" << endl;
	for (auto c : chaosData)
	{
		cout << c << " ";
	}

	cout << endl << "1.效率较低的一种冒泡排序:" << endl;
	clock_t clockLowB = clock();
	BubbleSortLow(chaosData, num);
	clock_t clockLowE = clock();
	cout << "第1种方法运行时间为:" << (double)(clockLowE - clockLowB) / CLOCKS_PER_SEC * 1000 << "秒" << endl;
	
	cout << endl << "2.正宗的一种冒泡排序:" << endl;
	clock_t clockMidB = clock();
	BubbleSortMid(chaosData, num);
	clock_t clockMidE = clock();
	cout << "第2种方法运行时间为:" << (double)(clockMidE - clockMidB) / CLOCKS_PER_SEC * 1000 << "秒" << endl;



	cout << endl << "3.优化后的一种冒泡排序:" << endl;
	clock_t clockHighB = clock();
	BubbleSortHight(chaosData, num);
	clock_t clockHighE = clock();
	cout << "第3种方法运行时间为:" << (double)(clockHighE - clockHighB) / CLOCKS_PER_SEC * 1000 << "秒" << endl;

	system("pause");
	return 0;
}

// 0.交换两个整型数据
int SwapNum(int &num1, int &num2)
{
	int tempNum = 0;

	tempNum = num1;
	num1 = num2;
	num2 = tempNum;

	return 0;
}

// 1.效率较低的一种冒泡排序
void BubbleSortLow(vector <int> chaosData, int num)
{
	for (int i = 0; i != num-1; ++i)
	{
		for (int j = i + 1; j != num; ++j)
		{
			if (chaosData[i] > chaosData[j])
			{
				SwapNum(chaosData[i], chaosData[j]);
			}
		}
	}
	cout << "排序后数据为:" << endl;
	for (auto c : chaosData)
	{
		cout << c << " ";
	}

}

// 2.正宗的一种冒泡排序:
void BubbleSortMid(vector <int> chaosData, int num)
{
	for (int i = 0; i != num-1; ++i)
	{
		for (int j = num - 1; j >= i; --j) // j>i
		{
			if (chaosData[i] > chaosData[j])
			{
				SwapNum(chaosData[i], chaosData[j]);
			}
		}
	}
	cout << "排序后数据为:" << endl;
	for (auto c : chaosData)
	{
		cout << c << " ";
	}
}

// 3.优化后的一种冒泡排序:
void BubbleSortHight(vector <int> chaosData, int num)
{
	int flag; // 为1则已经有序
// 	cout << "未排序:" << endl;
// 	for (auto c : chaosData)
// 	{
// 		cout << c << " ";
// 	}
// 	cout << "\n排序后" << endl;
	for (int i = 0; i != num - 1; ++i) // 循环判断:i未至最大数值 且 此时无序;flag为1则跳出循环
	{
		flag = 1; //无序
		for (int j = i+1; j != num; ++j)
		{
			if (chaosData[i] > chaosData[j])
			{
				SwapNum(chaosData[i], chaosData[j]);
				flag = 0;
			}

		}
// 		cout << "\ni=" << i << "  flag=" << flag << endl;//调试用
// 		for (auto c : chaosData)
// 		{
// 			cout << c << " ";
// 		}
		if (flag == 1)
			break;
	}
	cout << "排序后数据为:" << endl;
	for (auto c : chaosData)
	{
		cout << c << " ";
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值