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