排序(sorting).ppt

  1. 1、本文档共58页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
排序(sorting)

* 快速排序法 快速排序法(Quick Sort)又稱分割交換排序法,是目前公認最佳的排序法。 假設有n筆記錄R1,R2,R3…Rn,其鍵值為k1,k2,k3…kn。快速排序法的步驟如下: 1. 取K為第一筆鍵值。 2. 由左向向找出一個鍵值Ki使得KiK。 3. 由右向左找出一個鍵值Kj使得KjK。 4. 若ij則Ki與Kj交換,並繼續步驟?的執行。 5. 若i?j則將K與Kj交換,並以j為基準點將資料分為左右兩 部份。並以遞迴方式分別為左右兩半進行排序,直至 完成排序。 * 快速法分析 在最快及平均情況下,時間複雜度為O(nlog2n)。 最壞情況就是每次挑中的中間值不是最大就是最 小,其時間複雜度為O(n2)。 2. 快速排序法不是穩定排序法。 3. 在最差的情況下,空間複雜度為O(n),而最佳情況 為O(log2n)。 4. 快速排序法是平均執行時間最快的排序法。 * 範例程式:ch08_06.c 執行結果: * 堆積排序法 堆積(Heap Sort)是一種特殊的二元樹,可分為最大堆積樹及最小堆積樹兩種。 最大堆積樹滿足以下3個條件: 最小堆積樹則具備以下3個條件: 1.它是一個完整二元樹。 2.所有節點的值都大於或等於它左右子節點的值。 3.樹根是堆積樹中最大的。 1.它是一個完整二元樹。 2.所有節點的值都小於或等於它左右子節點的值。 3.樹根是堆積樹中最小的。 堆積的基礎-最大堆積 在堆積的節點中,最大值是根節點9,所有子節點的資料都等於或比父節點小,這種堆積稱為「最大堆積」(Max Heap),如下圖所示: 堆積的基礎-最小堆積 反過來,如果根節點的資料是最小,所有子節點的資料都等於或比父節點大,稱為「最小堆積」(Min Heap),如下圖所示: 建立最大堆積-實作 最大堆積是一棵完整二元樹,除了最高階層外,它是一棵完滿二元樹(Full Binary Tree),在實作上可以使用陣列來儲存最大堆積,如下圖所示: 建立最大堆積-索引計算 heap[]陣列儲存堆積資料,heap_len是目前堆積的元素數,索引值是從1開始,索引值0並沒有使用,此時堆積節點的索引值計算,如下所示: 右子節點索引 = 父節點索引 * 2 + 1 左子節點索引 = 父節點索引 * 2 父節點索引 = 子節點索引 / 2 建立最大堆積-插入節點(說明) 在最大堆積插入節點,首先將節點插入heap[]陣列的最後,也就是插入成為二元樹的葉節點。 然後與父節點進行比較,往上一一和其父節點比較,就可以將二元樹調整成為堆積。 建立最大堆積-插入節點(圖例1) 左邊的二元樹插入節點9,首先插入在陣列heap_len+1的索引位置,然後與其父節點5比較,因為比較大,所以對調,如下圖所示: 建立最大堆積-插入節點(圖例2) 因為節點9比較大,所以交換,最後和根節點8進行比較,比較大所以交換,最後就可以重建成堆積。函數shiftUp()就可以向上調整節點來重建堆積。 建立最大堆積-取出最大節點(說明) 從堆積取出最大節點,以最大堆積來說,就是根節點,同樣的,當刪除根節點後,就需要重新調整來建立堆積。 建立最大堆積-取出最大節點(圖例) 首先刪除根節點9,並且將它取代成最後一個節點5,然後從上至下,比較其子節點,因為比左子節點小,所以交換,然後再與子節點比較,比左子節6小,所以交換即可完成堆積的重建。 * 堆積法分析 在所有情況下,時間複雜度均為O (nlogn)。 堆積排序法不是穩定排序法。 只需要一額外的空間,空間複雜度為O (1)。 * 範例程式:ch08_07.c 執行結果: * 基數排序法 基數排序法(Radix Sort)依比較的方向可分為最有效鍵優先(Most Significant Digit First:MSD)和最無效鍵優先(Least Significant Digit First:LSD)兩種。 MSD法是從最左邊的位數開始比較,而LSD則是從最右邊的位數開始比較。 底下的範例我們以LSD將三位數的整數資料來加以排序,它是依個位數、十位數、百位數來進行排序。 * 原始資料: 步驟一:把每個整數依其個位數字放到串列中: 26 95 7 34 60 168 171 259 372 45 88 133 個位數字 0 1 2 3 4 5 6 7 8 9 資料 60 171 372 133 34 95 45 26 7 168 88 59 259 * 合併後成為: 步驟二:再依其十位數字,依序放到串列中: 60 171 372 133 34 95 45 7 168 88 59 259 十位數字 0 1 2 3 4 5 6 7 8 9 資料 7 133 34 45 59 2

文档评论(0)

maritime5 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档