思想
一个可排序的序列a,大小为n,将a分成左右两部分,大小分别为n1和n2,则有n1 + n2 = n,其中n1部分为已排序的子序列,n2部分为未排序的子序列。因此如果n1部分是从小到大排列,则从n2部分选出最小的一个,排到n1部分的末尾,则n1部分仍然是已排序的序列。
选择排序的思想如上所述,排序开始时将n1置为0,n2置为n,处理一遍之后n1+1,循环处理知道n1=n-1即将整个排序序列a排序完成。
代码
for (int i = 0; i < n - 1; i++)
{
int min_index = i;
for (int j = i + 1; j < n; j++)
{
if (a[j] < a[min_index])
min_index = j;
}
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
算法分析
时间复杂度
选择排序的操作有比较和交换的次数。
对于选择,次数为
(n-1) + (n-2) + 1
对于交换,次数为
n-1
空间复杂度
没有引入额外的存储空间,因此为0.