當前位置:首頁 » 操作系統 » 數據結構經典演算法

數據結構經典演算法

發布時間: 2024-09-13 00:32:22

㈠ 數據結構與演算法-隊列

同樣是線性表,隊列也有類似線性表的各種操作,不同的就是插入數據只能在隊尾進行,刪除數據只能在隊頭進行。

線性表有順序存儲和鏈式存儲,棧是線性表,所以有這兩種存儲方式。同樣,隊列作為一種特殊的線性表,也同樣存在這兩種存儲方式。

我們假設一個隊列有n個元素,則順序存儲的隊列需建立一個大於n的數組,並把隊列的所有元素存儲在數組的前n個單元,數組下標為0的一端即是隊頭。所謂的入隊列操作,其實就是在隊尾追加一個元素,不需要移動任何元素,因此時間復雜度為 。

與棧不同的是,隊列元素的出列是在隊頭,即下標為0的位置,那也就意味著,隊列中的所有元素都得向前移動,以保證隊列的隊頭,也就是下標為0的位置不為空,此時時間復雜度為 。

可有時想想,為什麼出隊列時一定要全部移動呢,如果不去限制隊列的元素必須存儲在數組的前n個單元這一條件,出隊的性能就會大大增加。也就是說,隊頭不需要一定在下標為0的位置,

為了避免當只有一個元素時,隊頭和隊尾重合使處理變得麻煩,所以引入兩個指針,front指針指向隊頭元素,rear指針指向隊尾元素的下一個位置,這樣當front等於rear時,此隊列不是還剩一個元素,而是空隊列。

假設是長度為5的數組,初始狀態,空隊列列如圖所示,front與rear指針均指向下標為0的位置。然後入隊a1、a2、a3、a4,front指針依然指向下標為0位置,而rear指針指向下標為4的位置。

出隊a1、a2,則front指針指向下標為2的位置,rear不變,如圖4-12-5的左圖所示,再入隊a5,此時front指針不變,rear指針移動到數組之外。嗯?數組之外,那將是哪裡?如下圖的右圖所示。

假設這個隊列的總個數不超過5個,但目前如果接著入隊的話,因數組末尾元素已經佔用,再向後加,就會產生數組越界的錯誤,可實際上,我們的隊列在下標為0和1的地方還是空閑的。我們把這種現象叫做「假溢出」。

所以解決假溢出的辦法就是後面滿了,就再從頭開始,也就是頭尾相接的循環。我們把隊列的這種頭尾相接的順序存儲結構稱為循環隊列。

如果將rear的指針指向下標為0的位置,那麼就不會出現指針指向不明的問題了,如下圖所示。

接著入隊a6,將它放置於下標為0處,rear指針指向下標為1處,如下圖的左圖所示。若再入隊a7,則rear指針就與front指針重合,同時指向下標為2的位置,如下圖的右圖所示。

由於rear可能比front大,也可能比front小,所以盡管它們只相差一個位置時就是滿的情況,但也可能是相差整整一圈。

所以若隊列的最大尺寸為QueueSize,那麼隊列滿的條件是(rear+1)%QueueSize==front(取模「%」的目的就是為了整合rear與front大小為一圈問題)。比如上面這個例子,QueueSize=5,上圖的左圖中front=0,而rear=4,(4+1)%5=0,所以此時隊列滿。

再比如圖下圖中的,front=2而rear=1。(1+1)%5=2,所以此時隊列也是滿的。

而對於下圖,front=2而rear=0,(0+1)%5=1,1≠2,所以此時隊列並沒有滿。

另外,當rear>front時,此時隊列的長度為rear-front。

但當rear<front時,,隊列長度分為兩段,一段是QueueSize-front,另一段是0+rear,加在一起,隊列長度為rear-front+QueueSize。因此通用的計算隊列滿隊公式為:

單是順序存儲,若不是循環隊列,演算法的時間性能是不高的,但循環隊列又面臨著數組可能會溢出的問題,所以我們還需要研究一下不需要擔心隊列長度的鏈式存儲結構。

隊列的鏈式存儲結構,其實就是線性表的單鏈表,只不過它只能尾進頭出而已,我們把它簡稱為鏈隊列。為了操作上的方便,我們將隊頭指針指向鏈隊列的頭結點,而隊尾指針指向終端結點。

空隊列時,front和rear都指向頭結點。

鏈隊列的結構為:

初始化一個空隊列

入隊操作時,其實就是在鏈表尾部插入結點,如圖所示。

出隊操作時,就是頭結點的後繼結點出隊,將頭結點的後繼改為它後面的結點,若鏈表除頭結點外只剩一個元素時,則需將rear指向頭結點,如圖所示。

對於循環隊列與鏈隊列的比較,可以從兩方面來考慮,從時間上,其實它們的基本操作都是常數時間,即都為O(1)的,不過循環隊列是事先申請好空間,使用期間不釋放,而對於鏈隊列,每次申請和釋放結點也會存在一些時間開銷,如果入隊出隊頻繁,則兩者還是有細微差異。對於空間上來說,循環隊列必須有一個固定的長度,所以就有了存儲元素個數和空間浪費的問題。而鏈隊列不存在這個問題,盡管它需要一個指針域,會產生一些空間上的開銷,但也可以接受。所以在空間上,鏈隊列更加靈活。

總的來說,在可以確定隊列長度最大值的情況下,建議用循環隊列,如果你無法預估隊列的長度時,則用鏈隊列。

棧和隊列也都可以通過鏈式存儲結構來實現,實現原則上與線性表基本相同如圖所示。

㈡ 數據結構-八大排序演算法的時間復雜度 穩定性

1:直接插入排序:
最好:待排序已經有序, 從前往後走都不用往裡面 插入。 時間復雜度為o(n)
最壞:待排序列是逆序,每一次都要移位插入。 時間復雜度o(n^2)
是穩定排序

2:希爾排序:
最好:縮小增量的插入排序,待排序已經有序。時間復雜度o(n)
一般:平均時間復雜度o(n 1.3),最差也是時間復雜度o(n 1.3)
不穩定排序

3:冒泡排序:
最好:待排序已經有序。時間復雜度o(n)
最壞:待排序是逆序。時間復雜度o(n^2)
穩定排序

4:快速排序:
最好:待排序無序。時間復雜度o(nlogn)
最壞: 待排序已經有序,基準定義在開始。 時間復雜度為o(n^2)
不穩定排序

5:直接選擇排序:
無論好壞:o(n^2)
穩定排序

6:堆排序:
無論好壞:時間復雜度o(nlogn)
不穩定排序

7:歸並排序:

穩定排序

8:基數排序:
無論好壞:o(d(n+r)) ,r為基數,d為位數.
穩定排序

㈢ 數據結構的排序演算法中,哪些排序是穩定的,哪些排序是不穩定的

一、穩定排序演算法

1、冒泡排序

2、雞尾酒排序

3、插入排序

4、桶排序

5、計數排序

6、合並排序

7、基數排序

8、二叉排序樹排序

二、不穩定排序演算法

1、選擇排序

2、希爾排序

3、組合排序

4、堆排序

5、平滑排序

6、快速排序

排序(Sorting) 是計算機程序設計中的一種重要操作,它的功能是將一個數據元素(或記錄)的任意序列,重新排列成一個關鍵字有序的序列。

一個排序演算法是穩定的,就是當有兩個相等記錄的關鍵字R和S,且在原本的列表中R出現在S之前,在排序過的列表中R也將會是在S之前。

不穩定排序演算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩定排序演算法從來不會如此。不穩定排序演算法可以被特別地實現為穩定。

做這件事情的一個方式是人工擴充鍵值的比較,如此在其他方面相同鍵值的兩個對象間之比較,就會被決定使用在原先數據次序中的條目,當作一個同分決賽。然而,要記住這種次序通常牽涉到額外的空間負擔。

(3)數據結構經典演算法擴展閱讀:

排序演算法的分類:

1、通過時間復雜度分類

計算的復雜度(最差、平均、和最好性能),依據列表(list)的大小(n)。

一般而言,好的性能是 O(nlogn),且壞的性能是 O(n^2)。對於一個排序理想的性能是 O(n)。

而僅使用一個抽象關鍵比較運算的排序演算法總平均上總是至少需要 O(nlogn)。

2、通過空間復雜度分類

存儲器使用量(空間復雜度)(以及其他電腦資源的使用)

3、通過穩定性分類

穩定的排序演算法會依照相等的關鍵(換言之就是值)維持紀錄的相對次序。

c語言的演算法有哪些

C語言的演算法主要包括排序演算法、查找演算法、數據結構相關演算法、字元串處理演算法等。


C語言作為編程語言中的一種,它本身的特性並沒有特定的演算法與之對應。但是,在進行編程的過程中,根據需求不同會設計到各種演算法的應用。以下是關於C語言中常見演算法的


排序演算法:排序是數據處理中非常常見的操作,C語言中常用的排序演算法包括冒泡排序、選擇排序、插入排序、快速排序等。這些排序演算法可以根據數據規模、實際需求進行選擇。例如,冒泡排序和選擇排序適合小規模數據的排序,而快速排序在處理大規模數據時效率更高。


查找演算法:在大量數據中查找特定元素時,需要用到查找演算法。C語言中常用的查找演算法包括線性查找、二分查找等。線性查找適用於無序數據,而二分查找則適用於有序數據,且數據規模較大時效率更高。


數據結構相關演算法:數據結構如數組、鏈表、棧、隊列等在C語言編程中廣泛應用,針對這些數據結構也有相應的演算法。例如,對於鏈表,有插入節點、刪除節點等演算法;對於棧,有入棧、出棧等演算法;對於樹結構,有樹的遍歷、搜索等演算法。


字元串處理演算法:在C語言中處理字元串時,也會涉及到一些特定的演算法。例如,字元串的拼接、分割、查找子串等都需要相應的演算法支持。


此外,還有一些更高級的演算法如圖論演算法、動態規劃演算法等,在解決復雜問題時也會用到。這些演算法的選擇和應用會根據具體問題和需求來確定。在C語言編程中,熟練掌握和運用各種演算法,能夠大大提高程序的效率和性能。

㈤ 數據結構有哪些基本演算法

一、排序演算法 1、有簡單排序(包括冒泡排序、插入排序、選擇排序) 2、快速排序,很常見的 3、堆排序, 4、歸並排序,最穩定的,即沒有太差的情況 二、搜索演算法 最基礎的有二分搜索演算法,最常見的搜索演算法,前提是序列已經有序 還有深度優先和廣度有限搜索;及使用剪枝,A*,hash表等方法對其進行優化。 三、當然,對於基本數據結構,棧,隊列,樹。都有一些基本的操作 例如,棧的pop,push,隊列的取隊頭,如隊;以及這些數據結構的具體實現,使用連續的存儲空間(數組),還是使用鏈表,兩種具體存儲方法下操作方式的具體實現也不一樣。 還有樹的操作,如先序遍歷,中序遍歷,後續遍歷。 當然,這些只是一些基本的針對數據結構的演算法。 而基本演算法的思想應該有:1、回溯2、遞歸3、貪心4、動態規劃5、分治有些數據結構教材沒有涉及基礎演算法,lz可以另外找一些基礎演算法書看一下。有興趣的可以上oj做題,呵呵。演算法真的要學起來那是挺費勁。

熱點內容
android常用的工具類 發布:2024-11-24 21:42:25 瀏覽:48
用戶管理源碼 發布:2024-11-24 21:29:36 瀏覽:677
監控怎麼配置路由器 發布:2024-11-24 21:29:27 瀏覽:455
小型編譯器的實現 發布:2024-11-24 21:27:48 瀏覽:999
安卓手機為什麼下巴不掉 發布:2024-11-24 21:26:37 瀏覽:214
怎麼編程槍戰 發布:2024-11-24 21:25:52 瀏覽:855
安卓公測版哪個好 發布:2024-11-24 21:15:58 瀏覽:873
androidforvs2010 發布:2024-11-24 21:06:05 瀏覽:286
安裝MySqllinux 發布:2024-11-24 21:05:51 瀏覽:326
聯通網洛盒的密碼在哪裡 發布:2024-11-24 21:05:12 瀏覽:181