#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;
}