排序算法 - 選擇排序(selection sort)


選擇排序(Selection sort)跟插入排序一樣,也是O(n^2)的復雜度,這個排序方式也可以用我們的撲克牌來解釋。

概念

桌面上有一堆牌,也是雜亂無章的,現在我們想將牌由小到大排序,如果使用選擇排序來做,應該是這樣來做。

  1. 遍歷桌面牌堆里的牌,從第一張牌到最后一張,找到牌面最小的一張,然后將抽出,並扣在手上。
  2. 第二次遍歷桌面牌堆里的牌,從第一張牌到最后一張,仍然去找現在桌面上牌面最小的一張,找出來,還是扣在手上。
  3. 第三次遍歷……重復步驟。雖然桌面上的牌是無序的,但是我們扣在手上的牌是有序的。
  4. 第N次遍歷……重復直到結束,現在桌面上沒有牌,所有的牌都抓在手里,而且手上的牌全是排序排好的。
    這個過程就是選擇排序。

偽代碼 - SelectionSort(seq)

n = seq.length
for j=1 to n-1
	smallest = j
	for i = j+1 to n
		if seq[i] < seq[smallest]
			smallest = i
	exchange seq[j] with seq[smallest]

注:
j=1指的是第一個元素,即我們常常的seq[0]。
套用一種語言來實現算法。

Python版

def sort(seq):
	n = len(seq)
	for j in range(n - 1):
		smallest = j
		for i in range(j + 1, n):
			if seq[i] < seq[smallest]:
				smallest = i
		if smallest != j:
			seq[j], seq[smallest] = seq[smallest], seq[j]
	return seq

Python版源碼:Github-Syler-Fun-Selectionsort-Python

Java版

public static int[] sort(int[] seq)
{
 int n = seq.length;
 for(int j = 0; j < n - 1; j++){
   int smallest = j;
   for(int i = j + 1; i < n; i++){
     if(seq[i] < seq[smallest]){
       smallest = i;
     }
     if(smallest !=j) {
       int temp = seq[smallest];
       seq[smallest] = seq[j];
       seq[j] = temp;
     }
   }
 }
 return seq;
}

Java版源碼:Github-Syler-Fun-Selectionsort-Java
看起來還是Python寫起來比較短一點呢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM