先找最小项,再确定一个位置
按升序排序时,算法扫描整个未处理后缀,记住最小键的位置,再把它与后缀的第一个元素交换。下一轮从更靠后的位置开始,前面的前缀已经是按序排列的最小若干项,不再参加搜索。
一次完整扫描只确定一个位置,并没有把后缀内部也排好。与插入排序将当前项放进有序前缀不同,选择排序主动在全部剩余候选中寻找下一项;两者都逐步扩大有序区域,却把比较和移动安排在不同地方。
参考:[1]
扫描次数与交换次数分开
长度为n的数组,需要依次检查约n、n减一、n减二等规模的剩余区域,比较总量因此是Θ(n²)。即使原数组已经升序排列,标准实现仍会扫描剩余后缀,不能直接得到插入排序那样的线性最好情况。
每轮至多把一个选中项交换到位,因此交换数是线性级;有的教材实现还执行元素与自身的交换。这解释了为什么比较次数和写入次数需要分开统计:某种数据移动很贵时,两项成本并不等价,但少交换也不保证总运行更快。
参考:[2]
远距离交换可能打乱同键记录
普通交换式选择排序不稳定。例如带身份的键2a、2b、1,首轮把1与2a交换后变成1、2b、2a,原来相等的两个2已经颠倒。比较规则没有要求它们交换,相对次序却因另一个较小键的远距离移动而改变。
若要求稳定,可以把找到的最小项取出,将其前面的区间依次右移,再放到开头;还须在同键最小项中选最靠左者。这种变体改变了数据移动方式,不能继续把标准实现的低交换数当作所有选择式方法共有的性质。