排序
插入排序
平均情況:O(N2)
最壞情況:O(N2)
選擇排序法
冒泡排序法
希爾排序
希爾排序也叫縮減增量排序。希爾排序使用一個序列h1,h2,h3, …, hn,叫做增量序列。當增量序列爲1,2,5時,示意圖如下:
以n=10的一個數組49, 38, 65, 97, 26, 13, 27, 49, 55, 4爲例
第一次 gap = 10 / 2 = 5
第二次 gap = 5 / 2 = 2
排序後
第四次 gap = 1 / 2 = 0 排序完成得到數組:
4 13 26 27 38 49 49 55 65 97
不同的增量序列有不同的算法時間複雜度,其中使用行如:1,3,7,。。。,2k-1的增量序列叫Hibbard序列,該增量序列下的最壞運行情況爲O(N3/2)
堆排序
平均情況:O(NLogN)
最壞情況:O(NLogN)
歸併排序
平均情況:O(NLogN)
最壞情況:O(NLogN)
合併排序是把需要排序的數組分爲兩部分,然後分別將兩部分排序,然後再另外一張表中插入這兩張已經排序好的表,依次類推。
歸併排序需要另外一張表。對內存需要比較大
快速排序
平均情況:O(NLogN)
最壞情況:O(N2)
快速排序首先選擇一個樞紐元,然後將大於樞紐元的放置一邊,小於的放在另一邊,依次類推。該方法不需要另外的內存。
桶排序和基數排序
桶排序
平均情況:O(N)
最壞情況:O(N)
通排序僅適用在排序元素是小於某個數的正整數時。
基本思想:是將陣列分到有限數量的桶子裏。每個桶子再個別排序(有可能再使用別的排序算法或是以遞迴方式繼續使用桶排序進行排序)。桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間(Θ(n))。但桶排序並不是
比較排序,他不受到 O(n log n) 下限的影響。
簡單來說,就是把數據分組,放在一個個的桶中,然後對每個桶裏面的在進行排序。
基數排序基於桶排序
見p213
不相交集類
數據結構
這是處理等價問題的一種算法,這裏的等價指的是集合,a與b等價,是指a∈S,b∈S。通過不相交集類的兩個基本操作find就可找出a和b的集合標誌是否一致,若一致則說明它們是一個集合的。當然,對於集合的表示,用的是森林的數據結構。集合的標誌就是根節點,若根節點一樣,就說明集合一樣。而除了唯一的根節點之外,剩下的節點裏面存放都是父節點的標誌。因此,我們只需要一個數據就能表示一個不相交集的結構了。不相交集類的另一個操作就是union。意圖是把兩個不屬於同一集合的元素,進行合併,使其等價
靈巧求並算法
在union(int root1,int root2)操作中,
按大小求並
集合中節點數個數的大小來判斷誰合併誰;若root1的個數大於root2的個數,則root1爲根,root2爲節點;
按高度求並
集合中樹的高度的大小來判斷誰合併誰;若root1的高度大於root2的高度,則root1爲根,root2爲節點;
注:大小並不等價於高度,越大的樹不一定高度越高。
路徑壓縮
每次,在find(int x)找到根節點之後,就將這個x添加到這個根節點的下面。那麼,下次尋找x的根的時候,其實,只要進行一次搜索即可,也就意味這遞歸的次數將大大減少。
具體例子見p234 圖8-15