1. 程式人生 > >python 資料結構與演算法 day04 選擇排序

python 資料結構與演算法 day04 選擇排序

1. 選擇排序

原理:從後面無序序列中選出最小的元素放在有序序列的後面,第一次先把第一個位置元素作為比較的物件,從後面n-1個元素中選出最小的那個元素 跟第一個位置元素進行交換,然後令第二個位置作為比較的物件,從後面n-2個元素中選最小的元素,跟第二個位置元素進行交換,,,以此類推;

 

下面的這個過程 是首先從前面系列中選出一個最大的元素,跟最後一個位置元素進行比較,如果前面序列中最大的元素比最後一個位置元素大 就交換,這樣序列中最後一個位置元素就是當前序列最大的元素;

然後從前面n-2個元素中再選一個最大的 跟序列中倒數第二個位置元素比較,如果比倒數第二個位置元素大,就交換,以此類推,逐漸把序列中大的元素放到隊尾;

 

 

 

2.程式碼實現

基於選擇後面序列中最小的元素,跟前面位置元素進行比較,把小的元素放在序列前面,依次找到序列中小的元素放在序列前面:

def select_sort(L):
    """選擇排序"""
    n=len(L)
    for i in range(n-1):   # 對應n-1個過程,每一次都會選出無序序列中的最小的元素放在前面有序序列中,這個過程持續n-1次 對應分別選出了n-1個最小
        min=i  # 對每一次查詢最小元素的過程,首先令有序序列中最後一個元素為該次過程需要比較的元素,拿後面位置的元素跟i位置的元素比較
for j in range(i+1,n): # 選出後面無序序列中的最小值 if L[j]<L[min]: min=j # 每一次找到一個比有序序列中最後一個位置元素小的 不急著交換,先記下來,因為目的是找到無序序列中最小的元素,而不是僅僅比i位置元素小就夠了 L[i],L[min]=L[min],L[i] return L print(select_sort([2,6,1,3,8,4,9,5,0]))

執行結果:

 

 3. 時間複雜度

選擇排序的時間複雜度是O(n^2)

因為選擇排序整體過程是逐步選出n-1個小元素放在前面n-1個位置,這就需要n的複雜度,然後內部對於每一次選出一個小元素 有需要比較無序序列中的所有元素,這個過程也需要n的複雜度;

 

4. 穩定性

選擇排序是不穩定的;

可以看上面那張圖,就是從前面無序序列中選大元素放在最後的排序過程,可以發現在從前往後找大元素的過程中,如果有兩個93 就會把前面一個93放在最後,這樣就打亂了相同元素原有的相對順序(因為首先從頭往後找最大元素,知道發現第一個最大也就是前面的93 然後接著往後比較,等到比對到第二個93時 第二個93並不比當前最大元素--第一個93大 所以不交換,所以仍然是第一個93作為最大元素往後走的~這就打亂了原有的順序,所以是不穩定的)

 

5. 優化

選擇排序對於有序序列仍然是O(n^2)的複雜度,並且無法進行優化,因為從頭到尾進行選小元素放在前面的過程有n次,每一次選小元素都需要比較所有元素 也需要n的複雜度;