直接插入排序(C)

直接插入排序

算法描述

  所謂直接插入排序,就是從插入第1個數值開始(存在第0位),直至插入第n個數值(當插入第n個數值時,前面n-1個數值已經是排好序的),插入完第n個數值時排序結束。

假設:數據集合爲N, 有n個數據, i = 1 爲第1個數值
第一步: 插入N【1】,比較與 N【0】的大小,若N【0】大於N【1】,N【0】後移,N【1】插入到N【0】位置,即: N【0】> N【1】,{ tmp = N【1】;N【1】= N【0】;N【0】= N【1】}
第二步:插入第 i 個數值N【i】,比較與N【i-1】的大小, 若N【i-1】大於N【i】,N【i-1】後移一位,原數值N【i】繼續與前面 i-1 個數值依次比較,大於N【i】的後移一位,直至遍歷完前面(i-1)個數值或者前面的數值小於原N【i】,將原N【i】插入前(i-1)個位置中的空出位置。
第三步:此排序爲順序排序,即大的向後移位,小的向前插入,當N【i-1】不大於N【i】時,無需進行插入,向後遍歷N【i++】即可,直到n結束。

示例代碼

結合上面的分析,用C實現一下直接插入排序:

void Insert_Sort(int N[], int length)
{
	int i, j, temp;
	for(i = 1; i < length; i++) {
		if(N[i-1] > N[i]) {
			temp = N[i];	// 臨時保存N【i】的數值,以備與前i-1個數值比較
			N[i] = N[i-1];	// 將N【i-1】後移一位
			for(j = i -1; j >= 0 && N[j] > temp; j--) {
				N[j+1] = N[j];	// 將N【j】後移一位
			}
			N[j+1] = temp;	// 將原始N【i】插入,完成一次插入排序
		}
	}
}

測試結果:輸入N【10】= {9 ,3, 3,8, 1, 0, 0, 2, 5, 4}
在這裏插入圖片描述

算法複雜度

空間複雜度:該算法只需要定義一個temp臨時變量,因此空間複雜度爲 O(1)
時間複雜度:最好情形,該集合已排序,只需遍歷比較 n - 1 次,不需要移動元素位置;最壞情形,每次插入N【i】, 需要與前面 i 個記錄都比較一次,爲 n * (n - 1) / 2 ,在第 i 次排序時,移動記錄的次數爲 i+1,求和得出時間複雜度爲 O(n^2)。
以上爲作者本人對於直接插入排序的理解及記錄,之後繼續總結其他排序算法,加油 ^ _ ^

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