選擇排序
選擇排序和插入排序類似,也是將數(shù)組分成了未排序部分和已排序部分,每一次循環(huán)的都在未排序的區(qū)間里面找到最小或者最大的值,然后將其放在左邊已排序區(qū)間。
代碼實(shí)現(xiàn)
"""
選擇排序
Author: xingrui
"""
# 選擇排序 - 正序
def selectSortWithAsc(nums: list) -> list:
length = len(nums)
for i in range(0, length - 1):
minIndex = i
for j in range(i + 1, length):
if nums[minIndex] > nums[j]:
minIndex = j
if minIndex != i:
temp = nums[i]
nums[i] = nums[minIndex]
nums[minIndex] = temp
return nums
# 選擇排序 - 逆序
def selectSortWithDesc(nums: list) -> list:
length = len(nums)
for i in range(0, length - 1):
maxIndex = i
for j in range(i + 1, length):
if nums[maxIndex] < nums[j]:
maxIndex = j
if maxIndex != i:
temp = nums[i]
nums[i] = nums[maxIndex]
nums[maxIndex] = temp
return nums
if __name__ == "__main__":
nums = [4, 5, 2, 6, 2, 3, 9, 3]
selectSortWithAsc(nums)
print('插入排序,正序排列', nums)
selectSortWithDesc(nums)
print('插入排序,逆序排列', nums)
分析
選擇排序的最好最壞時(shí)間復(fù)雜度都是,空間復(fù)雜度為
。值得注意的是,冒泡排序和插入排序都是穩(wěn)定的排序算法(即數(shù)組當(dāng)中相同的元素在排序之后,前后順序保持不變),而選擇排序不是穩(wěn)定的排序算法,舉個(gè)例子,有如下數(shù)組
按照選擇排序的原理,會(huì)找到未排序區(qū)間里最小的元素,1。然后將1放到最左邊,所以要將原本在最左邊的元素5與1進(jìn)行交換,這樣一來,原本在最前面的5跑到了最后,數(shù)組當(dāng)中兩個(gè)5的相對(duì)關(guān)系發(fā)生了變化,所以選擇排序不是穩(wěn)定的排序算法。
參考
http://www.lxweimin.com/writer#/notebooks/44679128/notes/66785923/preview
https://time.geekbang.org/column/article/41802
http://www.lxweimin.com/p/135261a2f8d1
http://www.lxweimin.com/p/05cdb2735d3b