1. 程式人生 > >每天一算法 -- (選擇排序)

每天一算法 -- (選擇排序)

大量 print 排好序 sort 數據 但是 main 出了 測試

一、原理

  每一趟從待排序的數中,選出最小的元素,並將 最小的元素 換到 趟數 對應的位置上。

二、思路

 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 }

每天一算法 -- (選擇排序)