一、思路
下面这张图是朴素的选择排序想法,向后依次遍历,选取最小的排到前面以及排好序的数据之后。
我们还有一种想法,就是设置一个mini和一个maxi用来记录未排序序列中的最小值和最大值,然后分别将其排到前面和后面,下面是代码实现。
二、代码实现
// 选择排序
// 时间复杂度:O(N^2)
// 最好的情况下:O(N^2)
void SelectSort(int* a, int n){ //两头开始跑
int begin = 0, end = n - 1;
while (begin < end){
int mini = begin, maxi = begin;
for (int i = begin + 1; i <= end; ++i){
if (a[i] < a[mini]){
mini = i;
}
if (a[i] > a[maxi]){
maxi = i;
}
}
Swap(&a[begin], &a[mini]);
if (maxi == begin){
maxi = mini;
}
Swap(&a[end], &a[maxi]);
++begin;
--end;
}
}
三、总结
选择排序是不稳定的排序,如何判断稳不稳定,就看相同的元素在排序前后能否保证相同的相对位置
堆排序在之前的博客中以及实现,并且充分分析了时间复杂度,有兴趣大家可以去看看
堆排序/top-k问题/建堆时间复杂度(C语言)-CSDN博客
选择排序也是非常经典且基础的排序算法,大家需要好好掌握