選擇排序(selection sort)

[簡介]算法

  選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工做原理以下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,而後,再從剩餘未排序元素中繼續尋找最小(大)元素,而後放到已排序序列的末尾。以此類推,直到全部元素均排序完畢。spa

  選擇排序的主要優勢與數據移動有關。若是某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有一個將被移到其最終位置上,所以對n個元素的表進行排序總共進行至多n-1次交換。在全部的徹底依靠交換去移動元素的排序方法中,選擇排序屬於很是好的一種。3d

 

[算法複雜度] code

  選擇排序的交換操做介於{\displaystyle 0}(n-1)次之間。選擇排序的比較操做n(n-1)/2次之間。選擇排序的賦值操做介於{\displaystyle 0}3(n-1)次之間。blog


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

  原地操做幾乎是選擇排序的惟一優勢,當方度(space complexity)要求較高時,能夠考慮選擇排序;實際適用的場合很是罕見。ip

 

[核心算法]it

  1. 找到最小的元素,與起始位置交換。
  2. 針對全部的元素重複以上的步驟,除了最開始一個。
  3. 持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何數字須要比較。

 

[口訣]io

  選擇選擇,勿動干戈
  挑中最小,就往頭跑
  頭小交換,繼續下遍class

 

[Source code]

 

 1 """
 2 Description
 3     From head to tail, select the largest(smallest) one
 4     swap the largest(smallest) one with the one in header or tailer
 5 
 6     選擇選擇,勿動干戈
 7     挑中最小,就往頭跑
 8     頭小交換,繼續下遍
 9 """
10 
11 """
12  助記碼
13 
14  i∈[0,N-1)                //循環N-1遍
15    j∈[i + 1,N)            //每遍循環要處理的無序部分
16      select(min)           //兩兩排序(升序/降序)
17    swap(i, min)
18 """
19 
20 def selection_sort(alist=None):
21     blist = alist[:]
22     N = len(blist)
23     for i in range(0, N - 1):
24         min = i
25         for j in range(i + 1, N):
26             if blist[j] < blist[min]:
27                 min = j
28         if min <> i:
29             blist[i], blist[min] = blist[min], blist[i]
30         
31     return blist
32 
33 
34 def selection_sort(alist=None):
35     blist = alist[:]
36     N = len(blist)
37     for i in range(0, N - 1):
38         max = N - i - 1
39         for j in range(0, N - i - 1):
40             if blist[j] > blist[max]:
41                 max = j
42         if max <> N - i - 1:
43             blist[N - i - 1], blist[max] = blist[max], blist[N - i - 1]
44     return blist
45     
46 print "Final result: ", selection_sort(ALIST)

 

[示意圖]

相關文章
相關標籤/搜索