上一篇我們談到了冒泡排序,實現了兩個版本的冒泡排序,不知道大家有沒有對冒泡排序的特點進行一下總結呢?其實冒泡排序還算是比較暴力的,因爲它頻繁不斷的進行交換,那麼這樣的話,我們的計算機的計算頻率就會很高,所以總體上是很低效的,那麼我們可不可以找到一種交換次數少一點的方法呢?這就引出了我們接下來要介紹的簡單選擇排序算法了.
簡單選擇排序的基本思想就是通過N-1次的關鍵字間的比較,從N - i + 1個記錄中選擇一個關鍵字最小記錄,並和第i(1<= i <= n)個記錄交換,其實簡單選擇排序和冒泡排序在思路上是幾乎一致的,只不過簡單選擇排序把冒泡排序的交換改爲了比較,因爲交換兩個值我們需要進行三次賦值,而比較只需要一次,這樣就減少了運算的次數,所以纔會更加高效(相對於冒泡排序來說,其實它們兩個都很低效).
好了,我們先上代碼
void simple_selection_sort(int array[], int length){
int i;
int j;
int min;
int temp;
for(i=0; i<length; i++){
min = i; //默認將當前下標的元素定義爲最小值
for(j=i+1; j<length; j++){
if(array[min] > array[j]){ //這是一個尋找最小值的過程
min = j;
}
}
if(min != i){ //如果最小值發生了變化,不再是第i個元素,那麼交換他們的位置
temp = array[i];
array[i] = array[min];
array[min] = temp;
}
}
}
這裏min的值是最小值的標記,例如,剛開始的時候,我們把min的值置爲0,意思是數組下標爲0的元素爲最小值,然後向後進行遍歷,跟這個min值進行比較,如果比它小的話,那麼更改min的值爲當前元素的下標,循環結束後,再用min的值和循環開始的位置的下標進行比較,如果不相等則進行交換.隨之進行下一次的遍歷,直至排序結束.
下面我們通過結合一個例子來講解一下,簡單選擇排序的執行流程.
假設待排序的序列爲{9, 1, 5, 8, 3, 7, 4, 6, 2},我們需要對i從0循環到7,當i = 0的時候,array[i] = 9,min的值爲0,然後再j = 1~8之間array[min]與array[j]的大小,因爲min等於1的時候最小,所以min=1,最後交換了array[0]和array[1]的位置.值得注意的是,我們在這裏只進行了一次交換.
之後幾次的循環和這一次幾乎一致,只不過是其實的位置靠後了一個位置而已.
其實簡單選擇排序相對冒泡排序來講,核心就是標記二字,它用min的標記,代替了冒泡排序的反覆交換,從而達到了提高效率的目的,最後,它的時間複雜度仍舊是O(n^2).OK,謝謝大家.