選擇排序 selection sort
時間複雜度
選擇排序每一趟找出一個最小(或最大)數放到序列起始位置,然後再從剩餘待排序元素中繼續找到最小(或最大)數,放到已排序的序列的尾部,以此類推,直到全部待排序元素排完。
選擇排序的思想和冒泡排序是類似的,但選擇排序和冒泡排序是有區別的1:
- 冒泡排序比較的是相鄰兩個數,而選擇排序是順序比較,找到最小(或最大)數。
- 冒泡排序每一輪的比較過程中,位置不對都要換,選擇排序每輪比較只是找出最小(或最大)數的索引, 一輪查完後只換一次位置即可。
- 冒泡排序是穩定的(算法是否穩定見後面補充內容),因爲當比較相鄰兩者時如果是一樣的,那麼不會調換位置,但是選擇排序是不穩定的(同見補充內容)。
選擇排序和冒泡排序的優劣:
- 選擇排序由於一次只交換一次,所以比冒泡排序效率高些,但兩者的總體時間複雜度都是,所以實際上我估計也快不到哪裏去。
- 選擇排序需要額外使用一個臨時空間。
- 選擇排序是不穩定的,但是冒泡排序是穩定的。
選擇排序的C語言實現
void swap_arr(int arr[], int i, int j)
{
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void selction_sort(int arr[], int len)
{
int i, j;
int smallest_index;
for(i = 0; i < len; i++)
{
smallest_index = i;
for(j = i+1; j < len; j++)
{
if(arr[j] < arr[smallest_index])
{
smallest_index = j;
}
}
swap_arr(arr, smallest_index, i);
}
}
補充內容
算法是否穩定的判斷標準:待排序的序列中有兩個相等元素,排序後它們的順序不變,爲算法是穩定的,否則爲算法不穩定。比如原序列中有兩個相同的值:,爲索引下標,且,那麼排序後還是。
下面來看選擇排序爲什麼是不穩定的。假如有一個序列:。該序列有兩個3,第一趟排序,會交換第1個3和1的位置,這樣排序後兩個3的順序就和原來就不一樣了,所以選擇排序是不穩定排序。
既然算法有穩定和不穩定之分,那麼穩定的算法有什麼好處呢?如果排序算法是穩定的,那麼從一個鍵上排序,然後再從另一個鍵上排序,第一個鍵排序的結果可以爲第二個鍵排序所用,這樣可減少開銷,說基數排序就是這樣的2,但是基數排序目前還沒去研究,等哪天研究到了,再結合算法的穩定性做總結。