概念
选择排序每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。
选择排序的优化:用两个指针,指向数据头和尾,两头同时遍历,找到最大和最小分别放到头和尾。
代码
//选择排序(普通版)
void SelectSort(int*a, size_t n)
{
assert(a);
for (size_t j = 0; j < n; ++j)
{
for (size_t i = 0; i < n; i++)
{
if (a[i] < a[i + 1])//每趟选出最小值放在末尾
{
int tmp = a[i];
a[i] = a[i + 1];
a[i + 1] = tmp;
}
}
}
}
//选择排序(优化版)
void SelectSort2(int* a, size_t n)
{
assert(a);
size_t left = 0;
size_t right = n;
while (left < right)
{
size_t min = left;
size_t max = right;
while( min < n)
{
if (a[min] < a[min + 1])
swap(a[min], a[min + 1]);
++min;
}
while(max > 0)//错误:不可是>=,因为是size_t类型
{
if (a[max]>a[max - 1])
swap(a[max], a[max - 1]);
--max;
}
left++;
right--;
}
}
时间复杂度
O(N^2)
空间复杂度
O(1)
稳定性
不稳定,会改变相同数据的位置
复杂性
简单