一、算法思想
选择表L的最大(小)元素,与最后位置上元素交换。其步骤如下:
- 对于表 L=(a1,az,a3,.…,ai.…,an),顺序遍历,选择出最大元素所在位置,与最后位置元素交换;
- 对于除最后一个元素之外的剩余部分构成的子表重复(1),直到剩余部分构成的子表表长等于1为止。
二、算法过程
三、实现
void SelectSort(int R[],int n)
{
int i,j;
int temp;
int max_index;
for(i=0;i<n;i++)
{
max_index=-1;
for(j=0;j<n-i;j++)
{
if(R[j]>max_index)
max_index=j;
}
if(max_index>=0)
{
j--;
temp=R[max_index];
R[max_index]=R[j];
R[j]=temp;
}
}
}
四、算法性能分析
(1)时间复杂度分析
两层循环的执行次数和初始序列没有关系,外层循环执行 n 次,内层循环执行 n-1 次,将最内层循环中的比较操作视为关键操作,其执行次数为 n(n-1)/2,故其平均时间复杂度、最坏时间复杂度、最好时间复杂度均为 O(n^2)
(2)空间复杂度分析
空间复杂度为 O(1)
(3)稳定性
从语句 if ( R[ j ] > max_index ) 中可以看到,算法总是将首次遇到的最大的值加入到已排序的序列中(如果遇到相同的值则会跳过),此时算法是不稳定的。(若将 > 改成 >= ,则算法稳定,但这样会增加 max_index = j 的执行次数)