如需轉發,請註明出處:小婷兒的python https://www.cnblogs.com/xxtalhr/p/10787340.html python
1、選擇排序(Selection sort)
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工做原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,因此稱爲:選擇排序。算法
一、原理
-
- 設第一個元素爲比較元素,依次和後面的元素比較,比較完全部元素找到最小的元素,將它和第一個元素互換
- 重複上述操做,咱們找出第二小的元素和第二個位置的元素互換,以此類推找出剩餘最小元素將它換到前面,即完成排序
二、舉例
舉個例子,假設我如今有一個數列須要使用冒泡來排序 [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22],post
咱們來看看使用冒泡的詳細步驟:spa
一、首先11做爲比較元素和列表後面的全部元素比較,找到最小的11,並放在第一位,第一輪完了,列表code
是 [11, 99, 33 , 69, 77, 88, 55, 11, 33, 36,39, 66, 44, 22]htm
二、而後,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]blog
三、第三輪比較完,22最小,和第三個元素33交換位置,列表變爲 [11, 11, 22, 69, 77, 88, 55, 99, 33, 36,39, 66, 44, 33]排序
四、最終獲得列表 [11, 11, 22, 33, 33, 36, 39, 44, 55, 66, 69, 77, 88, 99]
注:是一輪比較完後,找出最小的,再交換這個元素和對應輪數位置處的元素位置,每輪只交換一次。二冒泡排序是,沒比較一次,就交換一次位置,每輪要交換不少次。
2、代碼
代碼用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]
3、特色
選擇排序和冒泡排序很相似,可是選擇排序每輪比較只會有一次交換,而冒泡排序會有屢次交換,交換次數比冒泡排序少,就減小cpu的消耗,因此在數據量小的時候能夠用選擇排序,實際適用的場合很是少。
-
比較性:由於排序時元素之間須要比較,因此是比較排序
-
穩定性:由於存在任意位置的兩個元素交換,好比[5, 8, 5, 2],第一個5會和2交換位置,因此改變了兩個5原來的相對順序,因此爲不穩定排序。
-
時間複雜度:咱們看到選擇排序一樣是雙層循環n*(n-1)),因此時間複雜度也爲:O(n^2)
-
空間複雜度:只須要常數個輔助單元,因此空間複雜度也爲O(1)
-
記憶方法:選擇對象要先選最小的,由於嫩,哈哈
結果
Successfully !!!
有趣的事,Python永遠不會缺席!還不來加我,瞅什麼瞅。