冒泡排序

动图描述:https://img-blog.csdn.net/20161009190728886

#include <iostream>
#include <time.h>
#include <vector>
#include <ostream>
using namespace std;

#define RANDOM_NUM 10
// 随机生成RANDOM_NUM 个数
void RandomNum(vector<int>& v)
{
	v.clear();
	for (uint16_t i = 0; i < RANDOM_NUM; ++i)
	{
		int num = rand();
		v.push_back(num);
	}
}
// 针对vector重载<<用于输出vector的元素
template<typename T>
ostream& operator<<(ostream& cout,vector<T>& v)
{
	int n = v.size();
	for (int i = 0; i < n; ++i)
	{
		cout << v[i] << " ";
	}
	return cout << std::endl;
}

// 冒泡排序(外层for:[0,n-1) 内层for:前后比较,选出较大值,将较大值后移)
// 时间复杂度为平均为 O(n^2) : 最好为O(n),即已升序(该时间复杂度是在优化后才有,即判断没有前后交换过即有序了,如下的sorted字段);最坏情况:两层for循环,总共需要比较(1+2+..+ n - 1)次;即 n * (n - 1) / 2
// 空间复杂度 : 只用到常量个临时变量,所以为O(1)
// 稳定性:前一个值大于后一个值才交换,相等不替换(保证元素之间的相对位置),即保证稳定性
void BubbleSort(vector<int>& v)
{
	int n = v.size();
	if (n <= 1) return;

	for (int i = 0; i < n - 1;++ i)
	{
		int sorted = true;// 加了该变量,在有序情况下,第一次内层for比较n-1次发现有序就return了,所以事件复杂度为O(n)
		for (int j = 0; j < n - 1 - i; ++j)
		{
			int tmp = 0;
			if (v[j] > v[j + 1])// 前一个值大于后一个值才交换,相等不替换(保证元素之间的相对位置),即保证稳定性
			{
				sorted = false;
				tmp = v[j];
				v[j] = v[j + 1];
				v[j + 1] = tmp;
			}
		}
		if (sorted) return;
	}
}

int main()
{
	srand(unsigned(time(NULL)));
	vector<int> v;

	// 冒泡排序
	RandomNum(v);
	std::cout << v;
	BubbleSort(v);
	std::cout << v;

	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章