基本排序算法总结与对比 之二 ——选择排序
1、选择排序
选择排序的思路是每趟扫描数列,把最小的元素放到前面(或者把最大的元素放到前面)。
template<typename T>
void selectSort(T arr[], int lo, int hi)
{
int minIndex; //用来记录比较中最小元素的下标
for(int i = lo; i < hi - 1; i++)
{
minIndex = i; //每趟循环中 首先默认i处 为最小元素
for(int j = i + 1; j < hi; j++)
{
if(arr[j] < arr[minIndex]) //扫描中遇到更小元素时 更新minIndex
{
minIndex = j;
}
}
if(minIndex != i) //如果minIndex记录值不是i,则交换 i 与 minIndex 处的元素
{
std::swap(arr[i], arr[minIndex]);
}
}
}
首先,选择排序不是稳定的排序算法:例如 3 7 3 2 9 进行选择排序,开始第一个3就与2交换位置了 到了第二个3的后面。
其次,选择排序 最好,最坏,平均情况下的 的复杂度均为 O(n^2) 。只是最好的情况下交换次数为0,最坏的情况交换次数为n-1;由于平均交换次数比冒泡排序法(冒泡排序可能是每趟循环交换0 到 n-i 次)要少很多,所以选择排序通常比冒泡排序要快。