Python實(shí)現(xiàn)選擇排序

選擇排序

選擇排序和插入排序類似,也是將數(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ù)雜度都是O(n^2),空間復(fù)雜度為O(1)。值得注意的是,冒泡排序和插入排序都是穩(wěn)定的排序算法(即數(shù)組當(dāng)中相同的元素在排序之后,前后順序保持不變),而選擇排序不是穩(wěn)定的排序算法,舉個(gè)例子,有如下數(shù)組5, 2, 3, 6, 5, 1

按照選擇排序的原理,會(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容