演算法1 啊哈演算法!

2021-09-19 16:39:48 字數 1382 閱讀 2089

首先這裡會有乙個簡單的排序演算法。

問題: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();

getchar();//這裡的getchar();用來暫停程式,以便檢視程式輸出的內容//也可以用system("pause");等來代替

return 0;

}

上面是乙個簡單的排序演算法,i假如是0-m數的排序,需要m個桶來裝數出出現的次數,假如需要排序的數個數為n個,看一下時間複雜度的問題: 初始化-m次 , 讀變數-n次,列印:m+n次我們用大寫字母 o 來表示時間複雜度,因此該演算法的時間複雜度是 o(m+n+m+n)即 o(2*(m+n))。我們在說時間複雜度的時候可以忽略較小的常數,最終桶排序的時間複雜度為 o(m+n)。還有一點,在表示時間複雜度的時候,n 和 m通常用大寫字母即o(m+n)

桶排序從 1956 年就開始被使用,該演算法的基本思想是由e.j.issac 和 r.c.singleton 提出來的。之前我說過,其實這並不是真正的桶排序演算法,真正的桶排序演算法要比這個更加複雜。但是考慮到此處是演算法講解的第一篇,我想還是越簡單易懂越好,真正的桶排序留在以後再聊吧。

上面的演算法只能處理簡單的問題,而且比較浪費空間,而且無法進行小數排序。

氣泡排序的基本思想是:每次比較兩個相鄰的元素,如果它們的順序錯誤就把它們交換

過來

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

思路:

#include int main()

;//這裡建立了乙個結構體用來儲存姓名和分數

int main()

for(i=1;i<=1000;i++) //依次判斷1~1000這個1000個桶

getchar();getchar();

return 0;

}

這種方法的時間複雜度就是桶排序的時間複雜度,為 o(n+m)。

第二種:

#include int main()

//開始氣泡排序

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

}} printf("%d ",a[1]); //輸出第1個數

for(i=2;i<=n;i++) //從2迴圈到n

getchar();getchar();

return 0;

}

Queue 啊哈演算法

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

啊哈演算法(一)

1.最快最簡單的排序,桶排序 問題 假設有5個同學,在一場考試中分別取得分數為 滿分10 3 5 8 2 5,如何將他們按從大到小的順序排列?解決思路 定義乙個長度為11的陣列,即a 0 a 10 下標序號分別對應分數1 10 每乙個人得到乙個分數n,就使a n 如有兩個人得5分,a 5 2 然後依...

《啊哈!演算法》筆記

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