演算法渣-排序-選擇
選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法。
演算法
n個記錄的檔案的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:
- 初始狀態:無序區為R[1..n],有序區為空
- 第1趟排序
在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
…… - 第i趟排序
第i趟排序開始時,當前有序區和無序區分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。
演示
實現
static void selectSort(int []array) { for (int i=0;i<array.length-1;i++) { int min= i; for (int j = i+1;j<array.length;j++){ if(array[min] > array[j]) { min = j; } } if( min != i) { int tmp = array[i]; array[i] = array[min]; array[min] = tmp; } } }
複雜度
比較次數:T = (n-1))+ (n -2)+(n - 3)…. + 1; T = [n*(n-1) ] / 2;
交換次數:
最好的情況全部元素已經有序,則交換次數為0;
最差的情況,全部元素逆序,就要交換 n-1 次;
空間複雜度
最優的情況下(已經有順序)複雜度為:O(0)
最差的情況下(全部元素都要重新排序)複雜度為:O(n );
平均的時間複雜度:O(1)
Best | Average | Worst | Memory | Stable |
---|---|---|---|---|
n² | n² | n² | 1 | No |
VS 插入排序
插入排序特別的相似
複雜度一樣,但是插入排序和讀入(初始)的資料有關,最優情況只有O(n);而選擇排序不論如何,永遠都是O(n^2)
插入排序是邊讀邊排,每當讀入一個新的數時,目前的陣列一定是排好序的。而選擇排序不同,它必須是讀完所有的資料之後才能開始排序的。
那麼選擇排序的缺點就是,萬一資料量很大,比方說一百萬個,光讀就慢了,還要排序,那就更慢了。如果這兩個耗時的步驟可以並行一起做的話,顯然插入排序肯定就會快一些。