插入排序法示例:
將想要插入的值搜尋找到合適的位置,之前的數值一一向後移動乙個位置,騰出乙個空位置給想要插入的數值。
偽**:
instert-sort(a)
for j=2 to a.length
key = a[j]
i = j - 1
while i>0 and a[i] > key
a[i+1] = a[i]
i = i - 1
a[i+1] = key
幾種比較常用的演算法分析:
1、最壞情況分析:
t(n)定義為輸入規模為n時的最長執行時間
2、平均情況分析:
此時t(n)就成了輸入規模為n時,所有可能輸入的期望時間,也即每種輸入的執行時間乘以那種輸入出現的概率(加權平均)
3、最好情況分析(一般不去關注)
那麼插入排序的最壞情況時間是多少?
注意的一些問題:
1、計算機的效能
2、比較演算法時,通常比較的是其相對速度,也即兩個演算法在同一臺機器上的表現。
3、絕對速度?真有某種演算法能無論在什麼機器上執行都表現得更好嗎?
演算法分析的大局觀:漸進分析
其思想為:忽略掉哪些依賴於機器的常量,以及不是去檢查實際的執行時間而是去關注執行時間的增長t(n),n->無窮
漸進符號:
θ符號:棄去公式中低階項,並忽略前面的常數因子
θ(n^3)演算法與θ(n^2)演算法相比,從數學角度上看,總有乙個n使得θ(n^3)演算法會比θ(n^2)演算法開銷還大,但是從工程角度上講,這個n有可能連計算機也運算不到,因此就會有:儘管用漸進的觀點來看,他們有可能很慢,但他們仍然可以在合理的規模輸入下執行的更快,這也是為什麼有時會關注一些較慢的演算法!!!
對於插入排序的最壞情況:輸入的序列已經逆序排列好了
t(n) = θ(n^2)
歸併排序**:
#include#include#define array_num (10)
int merge(int *array, int min, int mid, int max)
r = (int*)calloc(1, rnum*sizeof(int));
if(null == r)
/* set l and r array */
for(i=0; imin)
return 0;
} int main(int argc, void *argv)
;
merge_sort(array, 0, array_num-1);
for(idx=0; idx
舉例:
歸併操作的思想:
1.申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
2.設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
3.比較兩個指標所指的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
4.重複步驟3直到某一指標到達序列的尾部
5.將另一串行剩下的元素直接複製到合併串的尾部
歸併演算法的t(n)=θ(nlgn)其中lg為以2為底的對數!!!!
演算法基礎知識
o 1 稱為不變複雜性 1項 1秒 10項 1秒 100個專案 1秒 專案的數量仍然增加10倍,但o 1 的比例因子總是1。o log n 稱為對數複雜度 1項 1秒 10項 2秒 100項 3秒 1000項 4秒 10000項 5秒 計算次數只會增加輸入值的對數。因此,在這種情況下,假定每個計算需...
演算法基礎知識
一 插入排序 撲克牌原理 n 2 原址 a 1,n 1 是排好序的,把第n個往前 二 分治法 歸併 nlgn 非原址 先分解 sort a,p,r if pa or b 三 分治法 最大子陣列問題 描述 尋找a的和最大的非空連續子陣列 解決 按中點分成兩段,遞迴找左右段各自的最大段,再找跨越中點的最...
演算法筆記 演算法基礎知識
演算法是一種解決某類問題 具體的 明確無歧義的計算過程。十進位制的指數。例如 1500 1.5 10 3 數量級是3,也可以是 千 kilo 150萬 1.5 10 6 數量級是6,也可以是 百萬 million 150萬比1500大3個數量級 執行環境資源有限,需要根據輸入規模 數量級 準備資源,...