选择排序
基本思想:每一趟(例如第i趟,i=0,1,…,n-2)在后面n-i个待排序的数据元素集合中选出关键码最小的数据元素,作为有序元素序列的第i个元素,待到第n-2趟做完,待排序元素集合中只剩 下1个元素,排序结束。
时间复杂度: O(n^2)
空间复杂度: O(1)
稳 定 性 :不稳定
适用场景:数据量较小,交换次数比较少
我们首先来看第一个版本
选择排序(单边缩小空间)
基本思想:我们定义一个maxIndex来标记区间内最大值的下标,第一次遍历完数组后,更新maxIndex的指向,与下标为end(最后一个元素)的元素交换,end–缩小空间,继续遍历更新maxIndex。
代码:
void SelectSort(int* arr, int size)
{
if (arr == NULL || size <= 0)
return;
for (int end = size - 1; end > 0; --end)
{
int maxIndex = end;//最大下标
for (int idx = 0; idx < end; ++idx)
{
//比最大的元素还大,更新最大下标
if (arr[idx] > arr[maxIndex])
maxIndex = idx;
}
//交换end与最大元素的值
std::swap(arr[maxIndex], arr[end]);
}
}
这个算法还可以优化,我下个博客再写。