排序算法系列——选择排序

什么是选择排序

选择排序可以说是众多排序算法中,最基础、最直观的一个算法了。

它的思想十分简单:

  1. 遍历列表,找出最小的一个数,记下索引
  2. 将最小的数添加到新的列表中,同时删除原数组中的数
  3. 重复第一步

排序过程

举个例子:

假如现在有一个无序数组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来取

欢迎大家友好交流[握手]

推荐阅读更多精彩内容