选择排序
基本思想:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
直接选择排序
在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素
若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素
void SelectSort(int* a, int n)
{
int begin = 0, end = n - 1;//记录末尾和开始位置
while (begin < end)//当begin小于end说明数组没有被完全排序
{
// [begin, end]
int mini = begin, maxi = begin;//将开始位置的值的下标赋予mini,maxi
for (int i = begin + 1; i <= end; i++)
{
if (a[i] > a[maxi])//比开始位置值大则maxi记录这一位置的下标
{
maxi = i;
}
if (a[i] < a[mini])//比开始位置值小则mini记录这一位置的下标
{
mini = i;
}
}
Swap(&a[begin], &a[mini]);//最小值与开始值交换
// max如果被换走了,修正一下
if (maxi == begin)
{
maxi = mini;
}
Swap(&a[end], &a[maxi]);
++begin;
--end;
}
}
直接选择排序的特性总结:
直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性:不稳定