说明
记录一下学习左神算法课的过程,都用C++实现,不会完全照着他的代码做翻译,基本上是了解思路之后自己先试着写,所以可能有错,欢迎大家指出。此外,为了写出更规范的代码,会尽量使用简洁的表达形式,比如lambda表达式、algorithm中的函数和三目表达式等,都是为了训练自己,大家一起加油!
简单选择排序
代码
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<vector>
using namespace std;
void Swap(vector<int>& arr, int i, int j)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
void SelectionSort(vector<int>& arr)
{
if (arr.size() < 2) return;
for (int i = 0; i < arr.size() - 1; i++)
{
int minIndex = i;
// 因为只需要执行 n-1 次,所以是arr.size()-1
for (int j = i + 1; j < arr.size(); j++)
{
// 每一趟都要比较到最后一个数,所以是arr.size()
minIndex = arr[j] < arr[minIndex] ? j : minIndex; // 若发现有更小的数,则更换最小的Index
}
Swap(arr, i, minIndex); // 之前只是找到了这一趟中,最小值对应的Index,仅在此处对数组进行实际的交换操作
}
}
void main()
{
vector<int> arr = vector<int>(10);
for (auto& elem : arr)
{
elem = rand()%101; // 生成0~100之间的随机数
}
// === 显示原无序数组 === //
cout << "原无序数组为:" << endl;
for_each(arr.begin(), arr.end(), [](const int& elem) { cout << elem << " "; }); // 用算法中的for_each进行数组的显示
cout << endl;
// === 简单选择排序 === //
SelectionSort(arr);
// === 显示排序后的数组 === //
cout << "有序数组为:" << endl;
for_each(arr.begin(), arr.end(), [](const int& elem) { cout << elem << " "; });
cout << endl;
system("pause");
}
输出
简单选择排序的性质总结:
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
1
)
O(1)
O(1)