啊哈演算法(一)

2022-05-23 06:45:07 字數 2528 閱讀 2499

1.最快最簡單的排序,桶排序

問題:假設有5個同學,在一場考試中分別取得分數為(滿分10):3  5  8  2  5,如何將他們按從大到小的順序排列?

解決思路:定義乙個長度為11的陣列,即a[0]-a[10],下標序號分別對應分數1-10;每乙個人得到乙個分數n,就使a[n]++,如有兩個人得5分,a[5]=2;

然後依次列印陣列小標序號,對應的值為n則列印n次。

圖形解釋:

+1+1      +1                           +1                                         +1

a[1]      a[2]    a[3]    a[4]    a[5]    a[6]    a7    a[8]   a[9]   a[10]

**如下:

#include int

main()

for(i=1; i<=5; i++)

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

}getchar();

getchar();

return

0}

總結:桶排序的優點是非常快速的排序;

缺點是浪費空間,如果需要排序的數範圍非常啊大:1~999999999,那麼就需要申請1000000000個變數(桶)a[999999999]。

運用場景:需要知道各變數出現的次數。 

2.氣泡排序

基本思想:每次比較兩個相鄰的元素,如果他們的順序錯誤,就把他們的位置交換。

問題:將12  35  99  18  76 五個數進行從大到小的排序。

解題思路:因為是從大到小排序,所以小的數應該排在後面。每次只比較兩個數,判斷較小的數是否在右邊,否則交換位置;

比較4次後,陣列中最小的數將出現在最右邊,我們稱之為「歸位」,這樣的一系列比較結束我們稱之為「一趟」;(歸位 和 趟 是非常重要的概念 !)

結束一趟後開始第二趟,比較3次,倒數第二小的數將出現在倒數第二的位置......

如此類推。

圖形解釋:兩個數中的較小數會一直往上走,就像冒泡一樣。

**如下:

1 #include 2

intmain()89

for(i=1; i<=n-1; i++)16}

17}1819

for(i=1; i<=n; i++)

2223

getchar();

24getchar();

25return0;

26 }

總結:氣泡排序每次只比較兩個數,從數列的前兩個開始

若比較n個數,則需要進行n-1趟,共有n-1個數歸位,直到最後乙個未歸位的數,排列才結束

第i趟時,只需要比較n-i次,因為已經有i-1個數歸位,不需要與歸位的數進行比較

氣泡排序的核心部分是雙重巢狀,外層是n-1趟,內層是這一趟要進行n-i次比較

缺點,氣泡排序時間複雜度非常高。

運用場景:對無序數列進行排序

3.快速排序

基本思想:確定基準數k,一般為數列中的第1個數。在數列兩邊分別向中間進行「探索」,依據判斷條件(如按順序排列),先從右端開始,當右邊某乙個值大於k時,左邊開始

當左邊某一值小於k時,左右兩個值交換,繼續探索,直到兩邊遍歷到同乙個值,將這個值與基準值k交換。

問題:對無序數列6  1  2  7  9  3  4  5   10  8進行排序。

解題思路: 確定基準數k(書中設為6),定義i  j兩個變數,分別從數列兩端(a[0]和a[9])向中間靠攏,當jk時,將a[i]和a[j]交換。

若是降序,判斷條件改為,當j>k,i圖形解釋:

k  i

j6 1  2  7  9 3  4  5  10  8

k  i                         j

6 1  2  7  9 3  4  5  10  8

k i                     j                       此時j6 1  2  7  9 3  4  5  10  8       

k    i                  j

6 1  2  7  9 3  4  5  10  8

k        i              j

6 1  2  7  9 3  4  5  10  8            變數i找到了比基準值大的數,滿足jk,將兩個數交換

k         i              j 

6 1  2  5  9 3  4  7  10  8    

k        i      j

6 1  2  5  4 3  9  7  10  8

k               i/j

6 1  2  5  4  3  9  7  10  8         最後,i 和 j 相遇,則將它和基準值交換  k <==> i/j

3 1  2  5  4  6  9  7  10  8         這數最後的結果

然後我們將6的左邊和右邊繼續使用同樣的方法進行排序即可。

演算法1 啊哈演算法!

首先這裡會有乙個簡單的排序演算法。問題 0 10內的數排序,假如有五個人的分數為為9,1,2,4,5 思路 include int main for i 0 i 10 i 依次判斷a 0 a 10 for j 1 j a i j 出現了幾次就列印幾次 printf d i getchar getch...

Queue 啊哈演算法

下面摘錄啊哈演算法中的重點片段及queue實現 同時總結資料結構佇列的常見用法 佇列是一種特殊的線性結構,它只允許在佇列的首部 head 進行刪除操作,這稱為 出隊 而在佇列 的尾部 tail 進行插入操作,這稱為 入隊 當佇列中沒有元素時 即head tail 稱為 空佇列。佇列符合先進先出的原則...

《啊哈!演算法》筆記

第 1 章 排序 桶排序 氣泡排序 快速排序 第 2 章 棧 佇列 鍊錶 佇列 棧 鍊錶 模擬鍊錶 第 3 章 列舉!很暴力 奧數數的全排列 第 4 章 萬能的搜尋 深度優先搜尋 廣度優先搜尋 第 5 章 圖的遍歷 深度和廣度優先 圖的深度優先遍歷 圖的廣度優先遍歷 第 6 章 最短路徑 第 1節 ...