选择排序
将长度为$n$的列表按从大到小(从小到大)的顺序排列
- 遍历该列表,找出最大的那个元素,添加到另一个新列表中
对于下面这个列表,想按照“play times”按从大到小排序:
music | play times |
---|---|
Ref:rain | 240 |
Silly | 130 |
remember | 163 |
Prayer X | 287 |
Angels | 132 |
Let it Out | 211 |
My Sweetest One | 126 |
遍历列表,找出播放次数最大的歌曲——“Prayer X”(287次),添加到新列表中。运行时间为$O(n)$(最坏的情况下,需要n个元素都找遍了才找到)。
music | play times |
---|---|
Prayer X | 287 |
再次遍历列表,找到播放次数第二多的音乐。运行时间为$O(n)$。
music | play times |
---|---|
Prayer X | 287 |
Ref:rain | 240 |
重复进行下去,直到将$n$个元素都添加到新列表。
每次运行时间为$O(n)$,共需要进行$n$次,所以选择排序的运行时间为$O(n^2)$。
实际上,第一次需要检查的元素有$n$个,第二次要检查的元素个数有$n-1$个,,随后要检查的元素个数依次为$n-2,\cdots,2,1$,平均每次检查的元素个数为$\frac{1}{2}n$,因此运行时间为$O(\frac{1}{2}n2)$,即$O(n2)$
稳定性
- 用数组实现的选择排序是不稳定的
- 用链表实现的选择排序是稳定的
通常使用数组实现选择排序,认为选择排序是不稳定的
Python实现
使用Python实现选择排序:
1 | def find_smallest(arr): |