原理
用通俗的语言来讲,选择排序,就是将数列中最大(小)的数找出来,放到合适的位置,然后在剩下的集合里面继续找最大(小)的数放在合适的位置,如此往复,直到整个数列变为有序位置。与冒泡排序不一样的是,它不是比较相邻的两个数,而是比较某个数与数列中剩下所有数的大小。
1.第一轮排序
原始数列为:
7 3 5 1 9 4
第一轮排序首先以第一个数为基数,与剩下的所有数进行比较,找到整个数列中最小的数,然后交换最小数与第一个数的位置。实现代码如下:
for i in range(0,len(iList)-1):
minIndex = i
for j in range(i+1,len(iList)-1):
if iList[j] <=iLIST[minIndex]:
minIdex = j
以上排序过程会将第i+1(i从0开始)大的数放在数列下标为i的位置,那么第一次排序的结果为:
1 3 5 7 9 4
2.第二轮排序:
1 3 5 7 9 4
3.第三轮排序:
1 3 4 7 9 5
4.第四轮排序:
1 3 4 5 9 7
5.第五轮排序:
1 3 4 5 7 9
代码实现
from randomList import randomList #这个模块是自定义的,在“Leetcode-排序-冒泡排序”那篇文章
import timeit
iList = randomList(20)
def selectionSort(iList):
if len(iList) <= 1:
return iList
for i in range(0, len(iList) - 1):
if iList[i] != min(iList[i:]): # 判断当前元素是不是从当前元素开始的剩下所有元素中最小的
minIndex = iList.index(min(iList[i:])) # 将从当前元素开始的剩下所有元素中最小的元素索引复制给minIndex
iList[i], iList[minIndex] = iList[minIndex], iList[i]#交换当前元素和最小元素
return iList
if __name__ == '__main__':
print(iList)
print(selectionSort(iList))
print(timeit.timeit("selectionSort(iList)","from __main__ import selectionSort,iList",number=100))#用此算法排序100次所花时间
整理于2020年10月14