演算法導論 插入排序

2021-06-25 18:25:12 字數 2413 閱讀 3426

/*

《introduction to algorithms(second edition)》

chapter2,insertion_sort()

date:2014-9-14

*/#include #include #include #define max 50

typedef struct

sortarr;

//直接插入排序

int insertionsort(sortarr *sortnum)

sortnum->arr[i+1] = key;

}return 0;

}//建立待排陣列

int creatsortarray(sortarr *sortnum)

ptr++;

}sortnum->length = (i - 1);

return 0;

}//列印陣列

int printarray(sortarr *sortnum)

printf("\n");

return 0;

}int main()

以上**的int insertionsort(sortarr *sortnum)部分為插入排序演算法,該部分**可以進行優化,考慮一下while((i > 0) && (sortnum->arr[i] > key))這句話,如果將arr[0]作為哨兵,將他的值和待排序的數字key的值相同,那麼就可以把i>0刪掉,每次執行到這裡時只需要進行(sortnum->arr[i] > key)一次比較,占用了乙個哨兵的儲存空間不過大大節省了程式的執行時間。**如下:

int advanceinsertionsort(sortarr *sortnum)

sortnum->arr[i+1] = key;

sortnum->arr[0] = 0;

}return 0;

}

時間複雜度分析影響程式執行時間的因素有:

· 輸入例項的規模

· 輸入資料的分布

· 儲存資料的資料結構

演算法的執行時間是指在特定輸入時,所執行的基本運算元。

下面分析一下在insertionsort()內部的關鍵步驟中每一條指令的執行時間和執行次數

其中n = sortnum->length,tj(j=2,3,4...)表示while迴圈所做的測試次數,當for或者while以正常方式退出時比較部分要比迴圈體多執行一次。本演算法總的執行時間就是每一條語句執行時間之和,如果執行一條語句耗時ci(i=1,2,3...),則該條語句總的執行時間為ci*n。設本演算法的總的執行時間是t[n],則:

對於相同的輸入例項,乙個演算法的執行時間還和輸入的資料的分布相關,例如在本演算法中,如果輸入的陣列本身是已經排好序的話,那麼就會出現最佳情況,在while((i > 0) && (sortnum->arr[i] > key))一句中,當i取其初始值j-1時,均有arr[i]<= key,則對於j=2,3,4...均有tj=1,且while下面的迴圈體均不執行。該程式的最佳執行時間為:

可以表示為t[n] = a*n+b,因此該演算法的時間複雜度是關於n的乙個線性函式,所以插入排序在最好情況下的時間複雜度為o(n)。

如果輸入的陣列是按逆序排序的,那麼此時會出現最壞的情況,在while((i > 0) && (sortnum->arr[i] > key))一句中,我們必須將每個arr[j]與整個已經排好序的子陣列的元素做比較,因而對於j=2,3,4...,有tj=j,根據高斯求和公式,其中:

insertionsort()的總體執行時間為:

可以表示為t[n] = a*n^2+b*n+c,這是乙個關於n的二次函式,所以插入排序在最壞的情況下他的時間複雜度為o(n^2)。

用遞迴的方法實現插入排序

還可以用遞迴的方法實現插入排序,假設待排序的陣列array[n],將其分為array[1...n-1]和array[n],首先將array[1...n-1]排成有序,然後將array[n]插到已排序的array[1...n-1]中去,這樣就形成了乙個遞迴式。下面是用遞迴的方法實現插入排序的**:

//遞迴實現直接插入排序

int recursioninsertsort(int arr, int start, int end)

key = arr[end];

for(i = end; i >= 0; i--)

else

}if(i != end)

return 0;

}

演算法導論 插入排序

插入排序應該算是比較好理解的一種了,原理類似於我們打牌的時候,摸牌插入手中的情景。來看一下圖,立刻就明白了 我們將乙個陣列int a 12 看做一副撲克牌,假設陣列有12個數,那麼撲克牌也一共有十二張,放在一起開始 我們先抽一張拿到手上,這時候,我們不需要排序,因為不論哪一張先被我們抽上來,不論大小...

演算法導論 插入排序

對於只有乙個元素的陣列,本身為已序。對於兩個元素的a,認為 a0 為已序,a1為key 若key a0 則將key 放到a0後。若不是,後移a0 對於多個元素的陣列 考慮將key 插入到已序的 a0 aj a0 a1 a2.中,可以將key 與aj a0 逐個比較,並後移,直到遇到乙個比key 小的...

演算法導論 插入排序

演算法導論 插入排序 標籤 空格分隔 演算法導論 什麼是排序?考慮對於給定輸入的某乙個陣列 a a a 經過排序演算法,我們可以得到原始排列的乙個序列a a a 2 a n a 其中ai 1 a i a ai 1 什麼是插入排序?對於陣列a 0 a 1 a n 1 取0 i n0 le i n 0 ...