演算法 基礎知識

2021-06-26 03:42:46 字數 1755 閱讀 1225

插入排序法示例:

將想要插入的值搜尋找到合適的位置,之前的數值一一向後移動乙個位置,騰出乙個空位置給想要插入的數值。

偽**:

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個數量級 執行環境資源有限,需要根據輸入規模 數量級 準備資源,...