Python排序算法(三)——選擇排序

有趣的事,Python永遠不會缺席!html

如需轉發,請註明出處:小婷兒的python  https://www.cnblogs.com/xxtalhr/p/10787340.html python

1、選擇排序(Selection sort)

  選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工做原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,因此稱爲:選擇排序。算法

一、原理

    1.   設第一個元素爲比較元素,依次和後面的元素比較,比較完全部元素找到最小的元素,將它和第一個元素互換
    2.  重複上述操做,咱們找出第二小的元素和第二個位置的元素互換,以此類推找出剩餘最小元素將它換到前面,即完成排序

二、舉例

      舉個例子,假設我如今有一個數列須要使用冒泡來排序 [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的消耗,因此在數據量小的時候能夠用選擇排序,實際適用的場合很是少

  1. 比較性:由於排序時元素之間須要比較,因此是比較排序

  2. 穩定性:由於存在任意位置的兩個元素交換,好比[5,  8, 5, 2],第一個5會和2交換位置,因此改變了兩個5原來的相對順序,因此爲不穩定排序

  3. 時間複雜度:咱們看到選擇排序一樣是雙層循環n*(n-1)),因此時間複雜度也爲:O(n^2)

  4. 空間複雜度:只須要常數個輔助單元,因此空間複雜度也爲O(1)

  5. 記憶方法:選擇對象要先選最小的,由於嫩,哈哈

結果   

  Successfully !!!

  有趣的事,Python永遠不會缺席!還不來加我,瞅什麼瞅。

相關文章
相關標籤/搜索