什么是选择排序
选择排序可以说是众多排序算法中,最基础、最直观的一个算法了。
它的思想十分简单:
- 遍历列表,找出最小的一个数,记下索引
- 将最小的数添加到新的列表中,同时删除原数组中的数
- 重复第一步
排序过程
举个例子:
假如现在有一个无序数组disorder_arr = [4,2,19,10,-1]
,和一个空数组order_arr = []
第一步:
遍历数组
找到disorder_arr
中最小值-1
,并记下它的索引4
第二步:
将-1
添加到order_arr
中
得到 order_arr = [-1]
第三步:
删除掉disorder_arr
中的-1
得到 disorder_arr = [4,2,19,10]
结束第一次循环
**重复上面的步骤 **
直到遍历len(disorder_arr)
次
于是便可得到一个有序数组order_arr=[-1,2,4,10,19]
写一段代码
用Python
来实现这个排序数组
# selectionSort.py
class Solution:
def selection(self, disorder_arr: list):
result_arr = []
for i in range(len(disorder_arr)):
min_index = 0
for index, item in enumerate(disorder_arr):
if item < disorder_arr[min_index]: # 找到最小数
min_index = index
result_arr.append(disorder_arr[min_index]) # 将最小数添加进新的列表
disorder_arr.pop(min_index) # 将原数组中的最小数删除,避免影响后续的判断
return result_arr
disorder_arr
待排序的数组
result_arr
是一个空数组,将每次遍历找到的最小数添加进来
min_index
最小数的索引
它的性能如何?
一般的来说,衡量的一个算法的性能我们通常使用大O表示法
由于这里使用了双重for
循环,
因此它的时间复杂度
为O(n^2)
。
那么它是一个稳定的算法吗?
关于选择排序是否稳定这一点,不同的书里有不同的看法。
我觉得这点得根据具体的实现来看,
本文所给出的将最小的数插入到一个新的数组
这种实现方式符合稳定算法的定义。
其他的实现方法,例如将当前值与最小值互换
的这种实现方法则是不稳定的。
将当前值与最小值互换
这种实现方法与本文的实现方法类似,就不单独列出了。
感兴趣的同学可以上我的github来取
欢迎大家友好交流[握手]