一、原理
把基本的排序算法簡略的看了一遍,可以說選擇排序也是最容易理解的一個了
舉個例子,如果有一個長度爲10的未排序的數組
我們第一次遍歷數組,找到這10個數中最小的數,與第一個數交換(如果第一個數就是最小的數,默認自己與自己交換)
而後,我們再遍歷一次除了第一個數以外的數,依舊找到這裏最小的數,與第二個數交換
這樣以此類推,我們就會得到一個排序好的數組
二、實現
其具體JAVA代碼如下:
for (int i = 0; i < ints.length; i++) {
int minIndex = i;
for (int j = i; j < ints.length; j++) {
if (ints[j] < ints[minIndex]) {
minIndex = j;
}
}
int temp = ints[i];
ints[i] = ints[minIndex];
ints[minIndex] = temp;
}
運行測試:
//最初的數據
215 | 365 | 511 | 158 | 586 | 724 | 548 | 931 | 951 | 784 |
//從全部數組中找到最小的數,與第一位進行交換,可以看出array[3] 與 array[0]進行了交換
158 | 365 | 511 | 215 | 586 | 724 | 548 | 931 | 951 | 784 |
//從除第一位外的數組中找到最小的數,與第二位進行交換,這裏array[3] 與 array[0]進行了交換
158 | 215 | 511 | 365 | 586 | 724 | 548 | 931 | 951 | 784 |
//以此類推...
158 | 215 | 365 | 511 | 586 | 724 | 548 | 931 | 951 | 784 |
158 | 215 | 365 | 511 | 586 | 724 | 548 | 931 | 951 | 784 |
158 | 215 | 365 | 511 | 548 | 724 | 586 | 931 | 951 | 784 |
158 | 215 | 365 | 511 | 548 | 586 | 724 | 931 | 951 | 784 |
158 | 215 | 365 | 511 | 548 | 586 | 724 | 931 | 951 | 784 |
158 | 215 | 365 | 511 | 548 | 586 | 724 | 784 | 951 | 931 |
158 | 215 | 365 | 511 | 548 | 586 | 724 | 784 | 931 | 951 |
//最終排序結果
158 | 215 | 365 | 511 | 548 | 586 | 724 | 784 | 931 | 951 |
三、時間複雜度
從代碼上可以看出
選擇排序中比較所花費的次數大概是
N + (N - 1) + (N - 2) + ... + 2 + 1 ~ N^2 / 2
交換所花費的次數大概是 N 次
所以總次數大概爲 (N^2 + 2N ) / 2
所以時間複雜度爲O(n^2)
四、特點
1、交換次數較少,交換次數即爲數組長度
2、對輸入數組的形式沒有依賴,也就是說不論是已經排序好的數組,還是部分排序,還是完全混亂的數組,它的時間複雜度都是相同的,都回去遍歷相同數量的數組,時間較爲穩定
3、時間複雜度爲平方級,不適合大數量級的排序