演算法中的各種排序以及查詢時間複雜度

2021-07-10 05:39:54 字數 3932 閱讀 2107

今天簡單的總結一下演算法中經常用到的排序以及查詢(用c語言實現,不全,持續更新)

一、首先是最常見也是最常被問的氣泡排序(原理就是每趟排序相鄰兩兩比較...因為比較好理解,就省略了)

//氣泡排序

-(void)maopaopaixu

;

//輸入

/*for(i=0;i<10;i++)

*/for(j=0;j<9;j++)}}

printf("氣泡排序的結果:");

for(i=0;i<10;i++)

printf("\n");

}

二、選擇排序

//選擇排序

-(void)selectpaixu

; int j;

int index;

int temp;

for (int i=0; i<9; i++)//對n個記錄進行n-1趟簡單選擇排序

;for(int i=0; i<10; i++)//進行n-1輪插入過程

a[j] = temp;}}

printf("插入排序的結果:");

for(int i=0; i<10; i++)

printf("\n");

}

或者

-(void)charupai

;

int temp;

for (int i=0; i<10; i++)

a[index]=temp;}}

for (int s=0; s<10; s++)

}

四、快速排序

//快速排序

-(void)fastpaixu

void sort(int *a, int left, int right)

int i = left;

int j = right;

int key = a[left];

while(i < j)

a[i] = a[j];

/*找到乙個這樣的數後就把它賦給前面的被拿走的i的值(如果第一次迴圈且key是a[left],那麼就是給key)*/

while(i < j && key >= a[i])

/*這是i在當組內向前尋找,同上,不過注意與key的大小關係停止迴圈和上面相反,因為排序思想是把數往兩邊扔,所以左右兩邊的數大小與key的關係相反*/

a[j] = a[i];

}/*當在當組內找完一遍以後就把中間數key回歸*/

a[i] = key;

/*最後用同樣的方式對分出來的左邊的小組進行同上的做法*/

sort(a, left, i - 1);

/*用同樣的方式對分出來的右邊的小組進行同上的做法*/

sort(a, i + 1, right);

/*當然最後可能會出現很多分左右,直到每一組的i = j 為止*/

}

五、折半法查詢

//折半查詢

-(void)binarychazhao

; int key=36;

int low = 0;

int high = 7;

ret=-1;

while(low<=high)

else

}if(ret == -1)

else

}

六、各排序方法的時間複雜度

排序法 

最差時間分析

平均時間複雜度 

穩定度 

空間複雜度 

氣泡排序

o(n2)

o(n2) 

穩定 o(1) 

快速排序

o(n2)

o(n*log2n) 

不穩定 

o(log2n)~o(n) 

選擇排序

o(n2)

o(n2) 

穩定 o(1) 

二叉樹排序

o(n2)

o(n*log2n) 

不穩定o(n) 

插入排序 

o(n2)

o(n2) 

穩定 o(1) 

堆排序o(n*log2n) 

o(n*log2n) 

不穩定 

o(1) 

希爾排序oo 

不穩定 

o(1)

1、時間複雜度 

(1)時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。 

(2)時間複雜度 在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度t(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。 一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),稱o(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。 

在各種不同演算法中,若演算法中語句執行次數為乙個常數,則時間複雜度為o(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如t(n)=n2+3n+4與t(n)=4n2+2n+1它們的頻度不同,但時間複雜度相同,都為o(n2)。 按數量級遞增排列,常見的時間複雜度有:常數階o(1),對數階o(log2n),線性階o(n), 線性對數階o(nlog2n),平方階o(n2),立方階o(n3),..., k次方階o(nk),指數階o(2n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。 2、空間複雜度 與時間複雜度類似,空間複雜度是指演算法在計算機內執行時所需儲存空間的度量。記作: s(n)=o(f(n)) 我們一般所討論的是除正常占用記憶體開銷外的輔助儲存單元規模。討論方法與時間複雜度類似,不再贅述。 

(3)漸進時間複雜度評價演算法時間效能   主要用演算法時間複雜度的數量級(即演算法的漸近時間複雜度)評價乙個演算法的時間效能。

2、類似於時間複雜度的討論,乙個演算法的空間複雜度(space complexity)s(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。漸近空間複雜度也常常簡稱為空間複雜度。 

空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。乙個演算法在計算機儲存器上所占用的儲存空間,包括儲存演算法本身所占用的儲存空間,演算法的輸入輸出資料所占用的儲存空間和演算法在執行過程中臨時占用的儲存空間這三個方面。演算法的輸入輸出資料所占用的儲存空間是由要解決的問題決定的,是通過參數列由呼叫函式傳遞而來的,它不隨本演算法的不同而改變。儲存演算法本身所占用的儲存空間與演算法書寫的長短成正比,要壓縮這方面的儲存空間,就必須編寫出較短的演算法。演算法在執行過程中臨時占用的儲存空間隨演算法的不同而異,有的演算法只需要占用少量的臨時工作單元,而且不隨問題規模的大小而改變,我們稱這種演算法是「就地/"進行的,是節省儲存的演算法,如這一節介紹過的幾個演算法都是如此;有的演算法需要占用的臨時工作單元數與解決問題的規模n有關,它隨著n的增大而增大,當n較大時,將占用較多的儲存單元,例如將在第九章介紹的快速排序和歸併排序演算法就屬於這種情況。

如當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1);當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為0(10g2n);當乙個演算法的空i司複雜度與n成線性比例關係時,可表示為0(n).若形參為陣列,則只需要為它分配乙個儲存由實參傳送來的乙個位址指標的空間,即乙個機器字長空間;若形參為引用方式,則也只需要為其分配儲存乙個位址的空間,用它來儲存對應實參變數的位址,以便由系統自動引用實參變數。

查詢與排序01,線性查詢,時間複雜度,演算法

線性查詢,肯定是以線性的方式,在集合或陣列中查詢某個元素。本篇包括 通過 來理解線性查詢 什麼叫 線性 還是在 中體會吧。首先需要乙個集合或陣列,如何得到呢?就生成乙個固定長度的隨機數組吧。然後輸入乙個查詢key,如果找到就返回元素的索引,沒找到就返回 1,就這麼簡單。class program所在...

MySQL中查詢時間差的寫法

計算日期間的時長,通過使用mysql的內建函式timestampdiff 實現。函式 timestampdiff 是mysql本身提供的可以計算兩個時間間隔的函式,語法為 timestampdiff unit,datetime expr1,datetime expr2 其中unit單位有如下幾種,分...

各種排序演算法比較以及時間複雜度

1.氣泡排序 n n。倆個for迴圈決定其時間複雜度為n 2 template class t void swap t a,inti,intj 冒泡法bubble sort template class t void bubsort t a,intn 2.選擇排序 n n。同樣,倆個for迴圈決定其...