冒泡排序

動圖描述: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章