选择排序
Posted 在这里, 意淫和实干都值得尊重
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择排序相关的知识,希望对你有一定的参考价值。
选择排序
描述:
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
基本思想:
第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;
第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;
以此类推,
第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,
使有序序列不断增长直到全部排序完毕。
示例:
以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列:
初始序列:{49 27 65 97 76 12 38}
第1趟:12与49交换:12{27 65 97 76 49 38}
第2趟:27不动 :12 27{65 97 76 49 38}
第3趟:65与38交换:12 27 38{97 76 49 65}
第4趟:97与49交换:12 27 38 49{76 97 65}
第5趟:76与65交换:12 27 38 49 65{97 76}
第6趟:97与76交换:12 27 38 49 65 76 97 完成
稳定性:
选择排序是不稳定的排序方法
ex:
序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面。
时间复杂度:
两个循环
所以时间复杂度为:O(n^2)
简洁版:
def select_sort(li):
n = len(li)
for i in range(n - 1):
min_num = i
for j in range(i + 1, n):
if li[min_num] > li[j]:
min_num = j
li[min_num], li[i] = li[i], li[min_num]
return li
注释版:
def select_sort(li):
n = len(li)
for i in range(n - 1):
# 外层循环控制内层循环的次数, 同时也控制内层循环从第几个数开始比较[注],
# 注: 假设第一次比对完之后, 找到数列中最小的值,
# 将这个最小值放在数列的第一个位置, 所以下一次比较, 跳过它, 从第二个位置处的元素进行比对
# 依次类推
min_num = i
# 比较前, 假设第一个数是最小的, 将它作为被比对的值, 与他后面的元素进行比对
for j in range(i + 1, n):
# 从被比对的值的后一位开始比对, 执行到列表的最后一个元素
if li[min_num] > li[j]:
# 如果前者大于后者, 记录后者的坐标
min_num = j
# 循环完成之后, 找到数列中最小的值
li[min_num], li[i] = li[i], li[min_num]
# 让这个值与被比对的值, 进行交换
return li
if __name__ == "__main__":
l = list(i for i in range(0, 1000))
print("洗牌之前的列表:" + str(l))
random.shuffle(l)
print("洗牌之后的列表:" + str(l))
print("冒泡之后的列表:" + str(select_sort(l)))
以上是关于选择排序的主要内容,如果未能解决你的问题,请参考以下文章
初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段