每天一算法 -- (選擇排序)
一、原理
每一趟從待排序的數中,選出最小的元素,並將 最小的元素 換到 趟數 對應的位置上。
二、思路
1.假設有一個數組為 [n個數],第一趟先選出 最小的元素 min[k],將min[k]位置 和 第一個元素的位置 互換,此時第一個元素就是 最小的元素 min[k];由於第一趟已經選出最小的元素,也就是第二趟中就從第二個元素比較,選出除了第一個的最小元素min[j],然後和 第二個元素互換,此時 第二小的 元素 也排好序了,後面的也就一樣的。
2.舉例說明:數組 [5,3,2,8,1,4]
第一趟:選出最小元素:1,將1和5 的位置互換,即
1,3,2,8,5,4
------------------------------------------------------------------------
第二趟:除了第一個元素,選出最小元素:2,將2和3的位置互換,即:
1,2,3,8,5,4
------------------------------------------------------------------------
第三趟:除了第一二個元素,選出最小元素:3,將 3和3的位置互換,即:
1,2,3,8,5,4
------------------------------------------------------------------------
第四趟:除了第一二三個元素:選出最小元素:4,將4和8的位置互換,即:
1,2,3,4,5,8
------------------------------------------------------------------------
第五趟:除了第一二三四個元素:選出最小元素:5,將5和5的位置互換,即:
1,2,3,4,5,8
------------------------------------------------------------------------
此時,原來的數據 已經按照從小到大的順序排列好了。
三、時間復雜度
選擇排序改進了冒泡排序,將必要的交互次數從O(n2)減少到O(n),但比較次數依然是O(n2)。選擇排序仍然為大計數量的排序提出了一個非常大的改進,因為這些大量的記錄會在內存中移動,這就是使交換的時間和比較的時間比起來,交換的時間更為重要。
選擇排序和冒泡排序執行了相同的比較次數,N(N-1)/2。對於10個數據項,需要進行45次比較,但 交換的次數卻小於 10次;對於100個數據項,需要進行4500次比較,但 交換的次數卻 小於100次。N值很大時,比較的次數是主要的。所以 選擇排序 和 冒泡排序的時間復雜度都是 O(n2),但是,選擇排序 無疑更快,因為它交換的次數少,
四、代碼實現
1 /** 2 * 排序算法 3 * @author Administrator 4 */ 5 public class Sort { 6 7 /** 8 * 選擇排序 9 * @param numbers 10 */ 11 public static void selectSort(int[] numbers) { 12 int min = 0; // 定義最小變量 13 int temp = 0; // 定義中間變量 14 15 for(int i = 0; i < numbers.length - 1 ; i++){ // 第i趟 16 min = i; 17 for(int j = i + 1; j < numbers.length; j ++){ // 找出最小元素 18 if(numbers[j] < numbers[min]){ 19 min = j; 20 } 21 } 22 temp = numbers[i]; 23 numbers[i] = numbers[min]; 24 numbers[min] = temp; 25 } 26 27 for(int i = 0;i<numbers.length;i++){ 28 System.out.print(numbers[i] + " "); 29 } 30 } 31 32 /** 33 * 測試 34 * @param args 35 */ 36 public static void main(String[] args) { 37 int[] arr = {5,3,2,8,1,4}; 38 selectSort(arr); 39 } 40 }
每天一算法 -- (選擇排序)