选择排序(Selection sort)

1410597-20181101222758469-484590984.gif
选择排序算是对冒泡排序的一种改进:假设有n个待排列的数据,在第一轮遍历中,仍进行n - 1次比较,遍历的时候用当前数与当前获得的最大数进行比较,而不是相邻的数据进行比较,且仅进行一次数据交换。而冒泡排序在每一次比较的过程中,发现数据顺序不一致就交换,数据交换的次数更多。选择排序只需要用标记记住每一轮的最大数,然后与排序模式中该最大数应该待的位置进行一次数据交换。
废话不多说,直接看Python的实现代码:

def selection_sort(a_list):
    for current_pass in range(len(a_list) - 1, 0, -1):
        max_index = 0
        for location in range(1, current_pass + 1):
            if a_list[location] > a_list[max_index]:
                max_index = location
        temp = a_list[max_index]
        a_list[max_index] = a_list[current_pass]
        a_list[current_pass] = temp


我们在每一轮中用max_index记录当前比较的最大值的索引位置,然后用下一个数据与当前所标记的最大值进行比较,若比当前最大值还大,则更新最大值的索引。一轮遍历完成后,进行数据交换,将当前轮次确定的最大值与指定位置的值进行一次数据交换。
值得注意的是,选择排序不是一个稳定的排序算法。比如有 2 9 5 9 3这几个数,进行从小到大排序,第一轮遍历时,确定了第一个9是最大的数,然后和3进行交换,交换后的顺序为2 3 5 9 9。显然排序前和排序后的2个9的相对位置发生了交换,算法稳定性遭到破坏。
有人可能会问,如果将if语句的>改为>=,那么第一轮遍历的时候第二个9就会与3进行交换,从而保证了第二个9在整体排序后依然排在第一个9的右边,从而保证了算法的稳定性。但不幸的是朋友,你错了。我们依然按照上面的例子,只是这次变成2 1 9 3 3,按照>=就交换最大值的原则,那么第一轮遍历时,9和最右边的3交换,从而破坏了2个3之间的相对顺序。而第二轮由于使用了>=,则2个3的相对顺序又没有改变回来。所以,不管是>还是>=就交换最大值,稳定性都有几率遭到破坏,故选择排序是一种不稳定的排序算法。

转载于:https://www.cnblogs.com/jeffrey-yang/p/9892881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值