数据结构与算法 | 选择排序

1 什么是选择排序

啥也不说了,首先上两个牛逼的动图:
在这里插入图片描述
以及:
在这里插入图片描述
从上面两个动图可以看出选择排序的思想为:

  • 将数据分为两部分 一部分是已排序ok的 另一部分是未排序的
  • 遍历每一个位置,设置两个变量:一个记录位置,一个记录最小值
  • 固定某一个位置的时候,初始化其也为最小值,遍历后面每个位置,和最小值进行比较,若小,则记录新的最小值的位置,直至遍历结束;然后进行此位置和最小值位置互换!
  • 循环进行上一步操作,即遍历每个位置!

小结:

  • 选择排序,从名字可以看出来“选择”是关键,选择谁呢?可以看到是分为两部分,每次都是将未排序部分元素的最小值 选择排序部分的最后边

2 代码实现

思路:

  • 一个位置一个位置的遍历【定一个变量i】
  • 首先选择第一个位置,然后看剩下元素是否有比这个小的,如果有,记录下标【定一个变量mix】,没有则还是保持原来的最小值对应的下标 循环结束后 将第一个位置的元素和最小值对应的元素的位置进行互换!
  • 遍历所有的位置。直至结束
def select_sort(alist):
    '''选择排序'''
    n = len(alist)
    for i in range(n-1):
        mix = i # 记录最小值的初始位置
        for j in range(i+1, n):
            if alist[j] < alist[mix]:
                # 如果后面遍历的值小于最小位置对应的值 则更新最小值对应的索引
                mix = j
            else:
                pass
        # 交换值
        alist[i], alist[mix] = alist[mix], alist[i]
    return alist
alist = [54,226,93,17,77,31,44,55,20]
select_sort(alist)
[17, 20, 31, 44, 54, 55, 77, 93, 226]

3 算法稳定性

算法不是稳定的,为什么呢?一个情景就是:升序每次选择最大的情况。

  • 上面算法实现的是每次选最小往左边放
  • 其实也可以每次选最大然后往右边放

两种策略!比如:

list = [23(a), 5, 7, 9, 23(b), 11, 15]

排序的时候:

第一个23(a)一开始会根据算法移动到最右边

流程如下:
list = [5, 7, 9, 23(b), 11, 15,23(a)]
list = [5, 7, 9, 11, 15,23(b),23(a)]

最终实现升序排列,而此时23(b),23(a)不是保持原有的 a b 而是 b a 了 也就是算法不稳定!

4 算法复杂度

  • 复杂度为 O( n 2 n^2 n2)

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值