【算法】簡單選擇排序C語言實現

上一篇我們談到了冒泡排序,實現了兩個版本的冒泡排序,不知道大家有沒有對冒泡排序的特點進行一下總結呢?其實冒泡排序還算是比較暴力的,因爲它頻繁不斷的進行交換,那麼這樣的話,我們的計算機的計算頻率就會很高,所以總體上是很低效的,那麼我們可不可以找到一種交換次數少一點的方法呢?這就引出了我們接下來要介紹的簡單選擇排序算法了.


簡單選擇排序的基本思想就是通過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,謝謝大家.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章