Sorting算法与算法的分析技术课件.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

6.關於QuickSort演算法的幾點討論:1)在最重要的性能,即平均時間代價上優於其他演算法。當n比較大時,一般運行確實很快,因此被廣泛採用。2)改善劃分元的選取,可能產生更好的效果。常見的幾種劃分元的選取方法是:·在first,…,last中取亂數i,以L[i]代替L[1];·在first,…,last中,取中間值i=int((first+last)/2);·取first,last,int((first+last)/2)三者的中值為劃分元下標。3)演算法的核心是劃分。不同的劃分策略會影響到移動次數。4)QuickSort採用遞歸演算法的形式,簡明但運行時在時間和空間上開銷較大。一種改進方法是使用由用戶設計的棧取代遞歸。演算法2.8快速排序的改進演算法QStackSort*5)空間複雜度的改進:快速排序演算法的額外空間需求與遞歸和棧有關。當把兩次遞歸調用改為單側進棧,可以改進空間複雜度。當輸入為昇冪(已排序)時,共需n–1次進棧,佔用O(n)空間。如果在程式中,每進行一次劃分以後,就對[f,i-1],[i+1,l]兩段進行比較,把較大的一半進棧,先計算(劃分)較小的一半,其內層迴圈次數(即棧的長度)必然小於logn,因此空間代價可降為O(logn)。6)快速排序演算法對於較小的n,其性能不及插入演算法。因此,可以設計一種綜合演算法,當輸入序列長度小於某個固定值(例如n0=50)時,改用InsertSort進行排序。7)快速排序的最壞情形時間複雜度和額外空間代價,無論如何改進,總是它的缺點和不足。*2.4.2合併排序演算法MergeSort1.演算法的思路:把序列分為兩部分,分別遞歸(排序)後,再把兩個有序序列合併為一個有序序列。如Fig.2.4。*2.有序序列的合併演算法:演算法2.9有序序列的合併演算法Merge3.合併排序演算法MergeSort:演算法2.10合併排序演算法MergeSort4.演算法的複雜度分析:該演算法對兩個長度為m的有序序列的合併,在最壞情形下至少需要2m–1次比較。演算法在最壞情形下的比較次數可用遞歸方程表示: (公式2.4.2)*忽略n為奇數的情形,由主項定理可得 。假定n=2k(k為正整數),則公式2.4.2可以簡化為:直接推導得:該演算法平均情形比較次數A(n)=Ω(nlogn)。其空間代價較大,需要大小為O(n)的額外空間。該演算法是不穩定的。*5.關於合併排序演算法的討論:1)對於時間複雜度而言,在最壞情形下大大優於快速排序,但在平均情況下不一定優於快速排序。數據的移動次數也會對時間性能有所影響。2)可以比較容易地改寫成非遞歸程序。3)合併排序的一種改進方法是充分利用輸入序列中可能的已排序部分。演算法2.11合併排序改進演算法IIMergeSort2例如,輸入序列為(4,12,8,6,0,11,27,5,20),實際上是4個有序串:(4,12),(8),(6,,11,27),(5,20)。第一趟掃描合併為:(4,8,12),(5,6,9,11,20,27),第二趟掃描就已排好序。這個演算法在在最好情形下的比較次數為B(n)=n–1。*4)主要缺點是空間代價較大,每次合併操作都需要與待合併的數據等長的額外空間,其額外空間代價為O(n)階。5)適合於並行計算。2.4.3堆排序演算法HeapSort1.堆排序演算法的思路:如Fig.2.5,演算法把待排序的數組L[1..n]視為一個二叉樹,數組元素依次按廣度第一的順序與二叉樹的結點相對應。結點間的鏈接利用下標來計算。對於結點i,如果2in,則i為葉結點,否則,2i為其左兒子下標,2i+1為其右兒子下標。*這樣的二叉樹的所有的葉結點位於樹的最底層即d層或d–1層,在最底層的葉結點位於左端。演算法由兩部分組成,第一部分稱為建堆(BuildingHeap),就是通過數據的比較和移動,使得二叉樹上每個內部節點的值大於其左、右子結點的值。這樣的二叉樹稱為堆(Heap),如Fig.2.6所示。*第二部分稱為根刪除—堆修復(Delete–Fix)過程,如Fig.2.7,可以描述為:for(i=n;i=2;i--){Swap(L[1],L[i]);FixHeap(L[1..i-1]

文档评论(0)

爱遛弯的张先生 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档