七種排序--------直接插入排序(Straight Insertion Sort)

直接插入的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的,記錄數增一的有序表。

代碼如下:

void InsertSort(SqList *L)
{
	int i,j,k;
	for(i = 2;i <= L->length;i++)
	{
		if(L->r[i] < L->r[i - 1])      //需將L->r[i]插入有序子表
		{
			L->r[0] = L->r[i];         //設置哨兵
		    for(j = i - 1;L->r[j] > L->r[0];j--)
		        L->r[j+1] = L->r[j];      //記錄後移
		    L->r[j + 1] = L->r[0];     //插入到正確位置
		}
	}
}

1.程序開始運行,此時我們傳入的Sqlist 參數的值爲length = 6,r[6] = {0,5,3,4,6,2},其中,r[0] = 0在後面將起到哨兵的作用,

2.第4~13行就是排序的主循環。i從2開始的意思是我們假設r[1] = 5已經放好位置,後面的牌其實就是插入到他的左側還是右側的問題。

3.第6行,此時 i = 2,L.r[i] = 3比L.r[i - 1] = 5 要小,因此執行第8~11行的操作。第8行,我們將L.r[0] 賦值爲L.r[i] = 3的目的是爲了起到第9~11行的循環終止的判斷依據。

4.此時,第10行就是在移動完成後空出了空位,然後第11行L.r[j + 1] = L.r[0],將哨兵的3賦值給j = 0時的L.r[j + 1]。

5.繼續像上面那樣循環,循環結束排序也就完成了。

排序複雜度:

如果排序記錄是隨機的,那麼根據概率相同的原則,平均比較和移動次數約爲n*n/4次。因此,直接插入排序法的時間複雜度爲O(n*n).雖然時間複雜度相同,但插入排序法比冒泡排序和簡單選擇排序的性能要好一點。

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