1. 程式人生 > >Python 3 實現選擇排序

Python 3 實現選擇排序

排序演算法練習比較有趣,之後的技術路線按照下表進行:

選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法。選擇排序是一種基礎的排序演算法,其基於陣列的資料結構進行的,因為他們在邏輯上相鄰的元素在實體記憶體之上也是彼此相鄰的。而且同一個陣列的資料型別必須是一致的,這樣我們就可以通過陣列的下標[index]進行隨機順序訪問陣列中的元素。排序的基本思想是:每一趟從待排序的記錄中選出最小的元素,順序放在已排好序的序列最後,直到全部記錄排序完畢。通俗的說:選擇排序就是通過陣列下標,不斷的選擇最小的元素,直至無元素選擇。

演算法原理:

     1. 選擇第一個元素的索引(確定規則:從小到大或從大到小)。

     2. 在剩下的元素中找到最小的數與之交換。

     3. 選擇剩下元素的第一個位置索引,重複1.2步操作,即可實現選擇排序。

演算法實現:  

#選擇排序
def Selection_Sort(list2):
  for i in range(0, len (list2)-1):
    min_ = i
    for j in range(i + 1, len(list2)):
      if list2[j] < list2[min_]:
        min_ = j
    list2[i], list2[min_] = list2[min_], list2[i]
    print(list2)
  print('選擇排序:', end=' ')
  print(list2)
#主函式
if __name__ =='__main__':
    List =np.random.randint(200, size=10)
    print('隨機列表:',end = '')
    print(List)
    #Bubble_Sort(List)
    # 選擇排序
    Selection_Sort(List)

        注:實驗中使用隨機生成列表的方式,使用Python numpy 包。

效果顯示:

時間複雜度:

選擇排序的交換操作介於 0 和 (n - 1) 次之間。選擇排序的比較操作為 n (n - 1) / 2 次之間。選擇排序的賦值操作介於 0 和 3 (n - 1) 次之間。

           比較次數O(n^2),比較次數與關鍵字的初始狀態無關,總的比較次數N=(n-1)+(n-2)+...+1=n*(n-1)/2。交換次數O(n),最好情況是,已經有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數比氣泡排序少多了,由於交換所需CPU時間比比較所需的CPU時間多,n值較小時,選擇排序比氣泡排序快。

演算法穩定性:

       選擇排序是給每個位置選擇當前元素最小的,比如給第一個位置選擇最小的,在剩餘元素裡面給第二個元素選擇第二小的,依次類推,直到第n-1個元素,第n個元素不用選擇了,因為只剩下它一個最大的元素了。那麼,在一趟選擇,如果一個元素比當前元素小,而該小的元素又出現在一個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。所以選擇排序是一個不穩定的排序演算法。