Python排序演算法之 選擇排序
一、選擇排序(Selection sort)
選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,所以稱為:選擇排序。
1、原理
設第一個元素為比較元素,依次和後面的元素比較,比較完所有元素找到最小的元素,將它和第一個元素互換
重複上述操作,我們找出第二小的元素和第二個位置的元素互換,以此類推找出剩餘最小元素將它換到前面,即完成排序
2、舉例
舉個例子,假設我現在有一個數列需要使用冒泡來排序 [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22],
我們來看看使用冒泡的詳細步驟:
1、首先11作為比較元素和列表後面的所有元素比較,找到最小的11,並放在第一位,第一輪完了,列表
是 [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]
2、然後,99作為比較元素,和後面的元素[33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]作比較,找到最小的11,
和第二位元素99交換位置,即第二輪比較完後,列表為 [11, 11, 33 , 69, 77, 88, 55, 99, 33, 36,39, 66, 44, 22]
3、第三輪比較完,22最小,和第三個元素33交換位置,列表變為 [11, 11, 22, 69, 77, 88, 55, 99, 33, 36,39, 66, 44, 33]
4、最終得到列表 [11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]
注:是一輪比較完後,找出最小的,再交換這個元素和對應輪數位置處的元素位置,每輪只交換一次。二氣泡排序是,沒比較一次,就交換一次位置,每輪要交換很多次。
二、程式碼
程式碼用jupyternotebook實現
實現思路: 使用雙重for迴圈,內層變數為i, 外層為j,在內層迴圈中不斷的比較相鄰的兩個值(j, j+1)的大小,如果j+1的值大於j的值,交換兩者位置,每迴圈一次,外層的i增加1,等到i等於(len(arr) - 1)的時候,結束迴圈
第一次看不懂很正常,不要灰心,下面是 jupyter 使用程式碼的實現
1 def selection_sort(arr):
2 """選擇排序"""
3 # 第一層for表示迴圈選擇的遍數
4 for i in range(len(arr) - 1):
5 # 將起始元素設為最小元素
6 min_index = i
7 # 第二層for表示最小元素和後面的元素逐個比較
8 for j in range(i + 1, len(arr)):
9 if arr[j] < arr[min_index]:
10 # 如果當前元素比最小元素小,則把當前元素角標記為最小元素角標
11 min_index = j
12 # 查詢一遍後將最小元素與起始元素互換
13 arr[min_index], arr[i] = arr[i], arr[min_index]
14 return arr
15 無錫看婦科的醫院
16 selection_sort([11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22])
17 #返回結果 [11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]
三、特點
選擇排序和氣泡排序很類似,但是選擇排序每輪比較只會有一次交換,而氣泡排序會有多次交換,交換次數比氣泡排序少,就減少cpu的消耗,所以在資料量小的時候可以用選擇排序,實際適用的場合非常少。
比較性:因為排序時元素之間需要比較,所以是比較排序
穩定性:因為存在任意位置的兩個元素交換,比如[5, 8, 5, 2],第一個5會和2交換位置,所以改變了兩個5原來的相對順序,所以為不穩定排序。
時間複雜度:我們看到選擇排序同樣是雙層迴圈n*(n-1)),所以時間複雜度也為:O(n^2)
空間複雜度:只需要常數個輔助單元,所以空間複雜度也為O(1)
記憶方法:選擇物件要先選最小的,因為嫩,哈哈
結果
Successfully !!!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2654229/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PHP 排序演算法之選擇排序PHP排序演算法
- 排序演算法之「選擇排序(SelectionSort) 」排序演算法
- 排序演算法入門之「選擇排序」排序演算法
- 排序演算法:選擇排序排序演算法
- 排序演算法__選擇排序排序演算法
- 演算法學習之選擇排序和堆排序:演算法排序
- 畫江湖之演算法篇【排序演算法】選擇排序演算法排序
- 畫江湖之演算法篇 [排序演算法] 選擇排序演算法排序
- 排序演算法 - 氣泡排序和選擇排序排序演算法
- 排序演算法入門:選擇排序排序演算法
- 經典排序之選擇排序(Java)排序Java
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- 演算法基礎:排序演算法:選擇排序演算法排序
- 深入淺出的排序演算法-選擇排序排序演算法
- 選擇排序(python)實現排序Python
- java選擇排序演算法Java排序演算法
- 常用演算法-選擇排序演算法排序
- PHP基礎演算法之選擇排序法PHP演算法排序
- 程式猿修仙之路--演算法之選擇排序演算法排序
- C#實現——十大排序演算法之選擇排序C#排序演算法
- go slice/map型別 排序(選擇排序演算法)Go型別排序演算法
- 選擇排序和快速排序排序
- 選擇排序排序
- 資料結構與演算法——排序演算法-選擇排序資料結構演算法排序
- 重學資料結構和演算法(四)之氣泡排序、插入排序、選擇排序資料結構演算法排序
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- 【一起學習排序演算法】3 選擇排序排序演算法
- 桶排序 選擇,插入排序排序
- 氣泡排序與選擇排序排序
- 選擇排序和氣泡排序排序
- 從演算法開始[選擇排序]演算法排序
- 選擇排序-演算法及優化排序演算法優化
- selection_Sort(選擇排序演算法)排序演算法
- 演算法小專欄:選擇排序演算法排序
- 選擇排序法排序
- 01選擇排序排序
- Java 選擇排序Java排序
- js選擇排序JS排序