/*
冒泡排序
平均时间复杂度:O(N^2) 最优:O(N) 最坏:O(N^2)
空间复杂度:O(N)
*/
template<typename T>
void bubble_sort(vector<T> &nums){
for (int i = 0; i < nums.size(); ++i)//times
for (int j = 0; j < nums.size() - i - 1; ++j)//position
if (nums[j] > nums[j + 1])
swap(nums[j], nums[j + 1]);
}
/*
插入排序
平均时间复杂度:O(N^2) 最优:O(N) 最坏:O(N^2)
空间复杂度:O(N)
*/
template<typename T>
void insert_sort(vector<T> &nums){
for (int i = 1; i < nums.size(); ++i)
for (int j = i; j > 0; --j)
if (nums[j - 1] > nums[j])
swap(nums[j], nums[j - 1]);
}
/*
选择排序
平均时间复杂度:O(N^2) 最优:O(N^2) 最坏:O(N^2)
空间复杂度:O(N)
*/
template<typename T>
void select_sort(vector<T> &nums){
for (int i = 0; i < nums.size(); ++i){
int min = i;
for (int j = i + 1; j < nums.size();++j)
if (nums[j] < nums[min])
min = j;
swap(nums[i], nums[min]);
}
}
/*
快速排序
平均时间复杂度:O(nlogn),最坏O(n^2);
空间复杂度:O(logn)
https://www.kancloud.cn/digest/pieces-algorithm/163612
*/
template<typename T>
void quick_sort(vector<T> &v, int left, int right)
{
if (left >= right) return;
int i = left, j = right;
T pivot = v[i];
while (i < j)
{
while (i < j && v[j] >= pivot) --j;
v[i] = v[j];
while (i < j && v[i] <= pivot) ++i;
v[j] = v[i];
}
v[i] = pivot;
quick_sort(v, left, i - 1);
quick_sort(v, i + 1, right);
}