選擇排序和快速排序演算法原理和Python實現

2021-08-03 11:00:19 字數 2346 閱讀 3765

選擇排序:這種排序演算法思路比較簡單,每一次都選出整個列表中的最小值或者最大值,直到結束。下面以最大值為例子。如果給你乙個列表[1,5,6,2]。

第一步:通過比較選出最大值6,需要檢查4個元素,計算3次,

第二步:通過比較選出剩餘元素列表的最大的元素5,需要檢查3個元素,計算2次

第三步:通過比較選出剩餘元素列表的最大的元素2,需要檢查2個元素,計算1次

第四步:剩餘乙個元素,結束

如果是列表元素有n個的情況下的分析類似上面:

第一步:通過比較選出最大值,需要檢查n個元素,計算n-1次

第二步:通過比較選出剩餘元素列表的最大的元素,需要檢查n-1個元素

直到結束

也就是每次選出最大值的過程都需要對比整個列表所有元素的值,才可以找出最大的值,一直到最後的乙個列表只有乙個元素結束,這樣的計算複雜度是o(n*n)

例如:

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_index = findsmallest(arr)

return newarr

a = [5, 6, 1, 2, 4]

print selectionsort(a)

輸出:

[1, 2, 4, 5, 6]

快速排序:快速排序是一種一般情況下比選擇排序更加快的一種排序方法。它的思路就是每次都先從列表裡面選出乙個基準值,在把列表中的其他元素與它進行對比,比它大的放在右邊組成乙個新的列表,比它小的放在左邊組成乙個新的列表。基準值的選取最簡單的就是選擇列表的第乙個元素,也可以隨機選取,這就看你自己的意願,選擇第乙個容易照成複雜度高一點,隨機的話可能更可以得到平均的計算複雜度的時間,直到結束,結束的時候列表的元素也就是乙個或者沒有。比如:給乙個列表為[3,5,6,1,4]

第一步:基準值選為3,小於它的列表為[1],大於它的列表為[5,6,4]

第二步:左邊的結束了,只要處理右邊的就可以,基準值為5,小於它的列表為[4],大於它的列表為[6],結束

第三步:把這些列表和基準值組合起來

結束如果列表有n個元素,也是如此,可以利用遞迴實現這個程式,如果遞迴的深度太多,就會出錯,記憶體不足,一般的程式語言中都會設定遞迴的最大深度,如果超過這個極限值,就報錯,大家注意一下子就好了。

快速排序的計算複雜度是o(n*logn),這是乙個平均的計算複雜度,也是最低的計算複雜度,最壞的情況就是選擇排序一樣的。如果你每次選擇第乙個元素是基準值,如果你的列表是乙個有序的列表,比如[1,2,3,4],那就和選擇排序一樣.因為列表沒有分成兩半,所以是一樣的。但是如果你每次選擇中間的做基準值,那就每次都是一半,很快就可以結束,這是最好的情況,只有o(logn)。

下面解釋一下平均計算複雜度:

在第一步選擇基準值以後,完成對比劃分的計算需要o(n),因為你要把這個元素和其他所有元素做對比

在第二步時,你已經分為兩個列表和乙個基準值,剩下列表的計算複雜度選好基準值,作比較,計算複雜度依舊是o(n),和第一步是一樣的,都是要計算乙個列表中基準值與所有其它值的對比情況。所以計算複雜度就是o(n*logn),這也是最低的計算複雜度。如果你每次都隨機選擇基準值,就可以達到這個計算複雜度,或者接近這個計算複雜度。因為隨機選取不會受到列表本身排序的影響,列表是否有順序我們是不知道的哈。這就可以解決每次基準值選取第乙個元素因為列表本身已經排好序的影響了,所以推薦使用隨機選取基準值。為了簡單實現,下面的例子採用第乙個元素為基準值

例如:

def quicksort(arr):

if len(arr) < 2:

return arr

else:

pivot = arr[0]

less = [i for i in arr[1:] if i <= pivot]

greater = [i for i in arr[1:] if i > pivot]

return quicksort(less) + [pivot] + quicksort(greater)

a = [5, 6, 1, 2, 4]

print quicksort(a)

輸出:

[1, 2, 4, 5, 6]

參考:演算法**

選擇排序和快速排序

include intmain int len strlen str 獲取字串長度 char min z 給乙個初始值,只需要它的ascal碼值小於等於z即可 int i int tempp for int j 0 j j str tempp str j str j min min z 內層迴圈每執...

排序演算法 Java實現 選擇排序法和快速排序法

為了方便擴充套件,先引入乙個抽象的基礎類 package com.andyidea.algorithms 排序抽象基礎類 author andy.chen param public abstract class sorter protected final void swap t array,int...

快速排序及其優化和快速選擇演算法

本文主要內容是快速排序的 編寫及其優化,還有快速選擇演算法 在無序的數中尋找第k大或小的元素 上 include include include include include include include include include include using namespace std d...