![9cef3c1823abf1c0f804dd7315a37aa1.png](https://i-blog.csdnimg.cn/blog_migrate/5719fa6551674393dce52f571fec943f.png)
排序之选择排序算法的实现
算法思路:
第一趟从待排序区选择最小(最大)的元素放到排序区的起始位置,第二趟从剩下的待排序区选择最小(最大)的元素放到排序区的第二个位置。以此类推,直到待排序区的元素个数为0。该算法为不稳定的排序算法。
将数组第一个元素设为开始时的最小值。实现过程中i作为区分已排序区和未排序区的交界,i左边为排序区,右边为未排序区。j作为索引,遍历未排序区,与当前i上的值比较,合适则交换,否则继续向下遍历。
一趟过程示例:
![fc0f12d313fab686a256d0ebd4bad0a0.png](https://i-blog.csdnimg.cn/blog_migrate/8af324c4eff863302edfba26dc3a0380.png)
![86ce482019fb1ff93c05e83eb99dcaf6.png](https://i-blog.csdnimg.cn/blog_migrate/5077449920022fae5025ea100bfe0887.png)
![64fbecb3a8dd7b0e4466dc76fb2056ed.png](https://i-blog.csdnimg.cn/blog_migrate/8fc612f309423813da316ab614d11ffd.png)
![0a321f18a10c3411e56b3d2521471bf1.png](https://i-blog.csdnimg.cn/blog_migrate/4edfeb2cdc466f0e77d8161833f30849.png)
![f7f9e281b7b8244efa739ed2dcc48f76.png](https://i-blog.csdnimg.cn/blog_migrate/290a1eb2a7e0f6e6d36b6ae4254f2f30.png)
![a2fe4dcaac88ce1189d53ad697af7560.png](https://i-blog.csdnimg.cn/blog_migrate/197830634b99aba07f55d12dfe833bef.png)
![3ada2ca0ad0994bf1ec67be2a7ec4a9f.png](https://i-blog.csdnimg.cn/blog_migrate/c5cce5bceab9e8f574b22bde17d1082d.png)
C语言实现:
#include
测试结果:
![f12dba4e88f4db42ea664bc16c436ea6.png](https://i-blog.csdnimg.cn/blog_migrate/eaedf3ee3c2ce2fcac1c82a1a9108ab3.png)
选择排序时间复杂度分析:
- 选择排序算法交换操作次数介于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!
参考
- ^百度百科:选择排序算法