简单选择排序和堆排序
Posted 一件风衣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单选择排序和堆排序相关的知识,希望对你有一定的参考价值。
最近V社的DOTA2的协调服务器似乎被卖外挂的俄罗斯黑客或者某讯利益相关人员给攻击了,出现了几十亿个自定义房间,有的自定义房间人数也很异常,甚至有几千万人的房间……直接导致各种蓝字,体验很差。难得通过自走棋吸引了一些玩家,现在又流失了不少,不管是谁干的,求求你们放过Dead game吧……
简单选择排序
这个算法的思路比较简单,很容易理解,但是效率比较低,首先还是来讲一下这个算法的详情,为后半段的堆排序打下基础。
(一)简单选择排序思想
名字中的选择二字就是这个思想的核心,我们依然以扑克牌为例子:
1.首先我们有一手牌,顺序为K,A,3,7,4,现在我们要把这一手牌从小到大排列;
2.首先我们找到这一手牌中最小的牌A,和第一张牌交换位置;
3.再找到后四张牌中最小的牌3,和第二张牌交换位置;
4.再找到后三张牌中最小的牌4,和第三张牌交换位置;
5.再找到后两张牌中最小的牌7,和第四张牌交换位置(此时7就在第四张牌的位置,不用交换);
6.此时排序已经完成,顺序为A,3,4,7,K。
过程图示如下:
(二)简单选择排序算法图解
可以从扑克牌的例子看出,这个算法的思想就是每次遍历未排序的部分,找到最大(或最小)的数,然后和相应位置的数字交换。对于长度为n的数组来说,最多只需要交换n-1次,但是算法复杂度达到了O(n^2)。
依然以数组[5,7,3,1,8,4,2,6]为例,图解如下:
(三)简单排序算法可视化演示
(四)简单排序算法的Python实现
# 简单选择排序
def SelectionSort(myList):
for i in range(0, len(myList) - 1):
index = i
# 找到待排部分的最小值
for j in range(i + 1, len(myList)):
if myList[index] > myList[j]:
index = j
# 交换
myList[i], myList[index] = myList[index], myList[i]
if __name__ == "__main__":
array = [5, 7, 3, 1, 8, 4, 2, 6]
SelectionSort(array)
print(array)
以上是关于简单选择排序和堆排序的主要内容,如果未能解决你的问题,请参考以下文章