廢話環節
學習小夥不請自來(biubiubiu…),簡單的說這是博主的第二篇關於Python數據結構的博客,所以文章中可能有些地方思路不是很清晰,希望大家發現並指出,近期博主也在一直努力喫透Python算法精髓,奈何背道而馳,現在仍然讓算法困擾不前,寫這篇博客一是想幫助Python愛好者,瞭解一下Python底層的算法,二是希望有大牛能夠指導點播一下本小白。愛Life,愛Python,這篇博客可能勞煩大家轉動一下自己的小腦筋,如果沒有喫透上一篇博客請戳此處:冒泡排序因爲本篇博客是以冒泡排序爲基礎寫作的,如果有喫瓜羣衆看不明白請回戳:冒泡排序,突突突…(開始)
①選擇排序(簡介)
選擇排序(Selection sort),總體上是改進了冒泡排序的一種基礎算法,每次遍歷列表中的元素然後只做一次交換。爲了做到這一點,一個選擇排序在它遍歷時尋找最大的值,並在完成遍歷結束後,將其放置在對應的位置。與冒泡排序一樣,在第一次遍歷後,最大的項在正確的地方。 第二次遍歷後,次大的放在其後。遍歷 n-1 次排序 n 個項。
假設你的計算機存儲了很多樂曲。對於每個樂隊,你都記錄了其作品被播放的次數。
你要將這個列表按播放次數從多到少的順序排列,從而將你喜歡的樂隊排序。該如何做呢?
首當其衝,遍歷這個列表,找出作品播放次數最多的樂隊,然後從大到小依次排列。達到如下的效果:
附上一份非常經典的選擇排序流程圖
按照如上所示,用代碼去初步實現排序
#!/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
@Author:HaoXuan