排序之选择排序算法的实现
算法思路:
第一趟从待排序区选择最小(最大)的元素放到排序区的起始位置,第二趟从剩下的待排序区选择最小(最大)的元素放到排序区的第二个位置。以此类推,直到待排序区的元素个数为0。该算法为不稳定的排序算法。
将数组第一个元素设为开始时的最小值。实现过程中i作为区分已排序区和未排序区的交界,i左边为排序区,右边为未排序区。j作为索引,遍历未排序区,与当前i上的值比较,合适则交换,否则继续向下遍历。
一趟过程示例:
C语言实现:
#include
测试结果:
选择排序时间复杂度分析:
- 选择排序算法交换操作次数介于0和(n-1)之间(正序为0次,最坏情况时都要交换为n-1次)
- 比较操作次数在n(n-1)/2之间(选择排序算法比较次数与数据初始状态无关,每趟都要比较,次数为,(n-1)+(n-2)+...+1=n(n-1)/2),为O(
)
- 赋值操作次数介于0和3(n-1)之间(同交换操作,每次交换操作需要3次赋值操作,故最坏情况下需要赋值操作3(n-1)次)
- 总的时间复杂度为O(
)
稳定性:
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。[1]
Bingo!
参考
- ^百度百科:选择排序算法