助你喫透那些年被捧上天的神祕算法(Python版②)

廢話環節

學習小夥不請自來(biubiubiu…),簡單的說這是博主的第二篇關於Python數據結構的博客,所以文章中可能有些地方思路不是很清晰,希望大家發現並指出,近期博主也在一直努力喫透Python算法精髓,奈何背道而馳,現在仍然讓算法困擾不前,寫這篇博客一是想幫助Python愛好者,瞭解一下Python底層的算法,二是希望有大牛能夠指導點播一下本小白。愛Life,愛Python,這篇博客可能勞煩大家轉動一下自己的小腦筋,如果沒有喫透上一篇博客請戳此處:冒泡排序因爲本篇博客是以冒泡排序爲基礎寫作的,如果有喫瓜羣衆看不明白請回戳:冒泡排序,突突突…(開始)

①選擇排序(簡介)

選擇排序(Selection sort),總體上是改進了冒泡排序的一種基礎算法,每次遍歷列表中的元素然後只做一次交換。爲了做到這一點,一個選擇排序在它遍歷時尋找最大的值,並在完成遍歷結束後,將其放置在對應的位置。與冒泡排序一樣,在第一次遍歷後,最大的項在正確的地方。 第二次遍歷後,次大的放在其後。遍歷 n-1 次排序 n 個項。

假設你的計算機存儲了很多樂曲。對於每個樂隊,你都記錄了其作品被播放的次數。
在這裏插入圖片描述
你要將這個列表按播放次數從多到少的順序排列,從而將你喜歡的樂隊排序。該如何做呢?
首當其衝,遍歷這個列表,找出作品播放次數最多的樂隊,然後從大到小依次排列。達到如下的效果:
在這裏插入圖片描述
附上一份非常經典的選擇排序流程圖
HaoXuan
按照如上所示,用代碼去初步實現排序

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2020/3/17 14:13
# @Author  : HaoXuan
# @File    : 選擇排序.py
# @Software: PyCharm
def select_sort(alist):
    n = len(alist)
    for j in range(n-1):
        for i in range(j+1,n):
            if alist[j] > alist[i]:
                alist[j],alist[i] = alist[i],alist[j]

list0 = [26,54,93,17,72,31,44,55,20]
select_sort(list0)
print(list0)

糾錯:上面所寫的代碼雖然也可以讓元素按照正確順序排列,但是裏面的設計思路與選擇排序有所不同。以上代碼根本上是完全繼承了冒泡排序的思路,相鄰元素互換位置,誰小就往前放,但沒有依次選擇出最小的元素往前放;
選擇排序要求:遍歷一輪後,把最小的放最前面,然後對剩餘元素再次遍歷,選出最小的放在第二個位置
修改代碼如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2020/3/17 14:13
# @Author  : HaoXuan
# @File    : 選擇排序.py
# @Software: PyCharm
def select_sort(alist):
    n = len(alist)
    # 需要進行n-1次選擇操作
    for i in range(n - 1):
        # 記錄最小值索引的位置
        min_index = i
        # 從i+1位置到末尾選擇出最小數據
        for j in range(i + 1, n):
            if alist[min_index] > alist[j]:
                min_index = j
        alist[i], alist[min_index] = alist[min_index], alist[i]


list0 = [26, 54, 93, 17, 72, 31, 44, 55, 20]
select_sort(list0)
print(list0)

你可能會看到選擇排序與冒泡排序有相同數量的比較,所以選擇排序時間複雜度
最優時間複雜度:O(n2)
最壞時間複雜度:O(n2)
穩定性:不穩定
在某種層面來說如果選擇排序運用不夠靈巧,那不如回戳:冒泡排序來幫助你解決Question,此處需要觀衆們細想…

②快速選擇排序

選擇排序是一種非常非常靈巧的算法,但其速度不是很快。快速排序是一種更快的排序算法,其運行
時間複雜度爲O(n log n)

快速選擇排序動態分析:
在這裏插入圖片描述
如下所示將隨機取一數組並將元素按從小到大的順序排列。先編寫一個用於找出數組中最小元素的函數。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2020/3/17 14:13
# @Author  : HaoXuan
# @File    : 快速選擇排序.py
# @Software: PyCharm
def findSmallest(arr):
    smallest = arr[0]  # 存儲最小的值
    smallest_index = 0  # 存儲最小元素的索引

    for i in range(1, len(arr)):  # 對數組進行排序
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index


# 快速選擇排序核心代碼
def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr)  # 找出數組中最小的元素,並將其加入到新數組中
        newArr.append(arr.pop(smallest))
    return newArr


print(selectionSort([5, 3, 6, 2, 10]))  #隨機取值

運行如下圖所示
在這裏插入圖片描述
博主也是個現學現賣的小白,如果文章中出現了什麼技術問題,希望大牛們能夠及時指出,我也在不斷努力學習,希望能夠把博文寫的更好,幫助大家減輕閱讀時的煩惱,所以,希望大家初期多擔待一下,努力ing
HaoXuan
@Author:HaoXuan

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章