《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 一種改進的堆排序算法
一種改進的堆排序算法
2015年微型機與應用第5期
梁 佳
(青海大學 計算機技術與應用系,青海 西寧 810016)
摘要: 對傳統堆排序算法進行分析并做出改進。利用堆的性質降低堆排序過程中的數據比較次數,從而在不提高空間復雜度的前提下改進了堆排序算法的效率。通過理論分析得到改進算法在堆重建過程中的數據比較次數是傳統堆排序算法的一半,即改進算法的時間復雜度的主項系數是傳統算法的1/2。同時,實驗結果表明,改進算法的效率比傳統算法提高了20%左右。
Abstract:
Key words :

  摘  要: 對傳統堆排序算法進行分析并做出改進。利用堆的性質降低堆排序過程中的數據比較次數,從而在不提高空間復雜度的前提下改進了堆排序算法的效率。通過理論分析得到改進算法在堆重建過程中的數據比較次數是傳統堆排序算法的一半,即改進算法的時間復雜度的主項系數是傳統算法的1/2。同時,實驗結果表明,改進算法的效率比傳統算法提高了20%左右。

  關鍵詞: 堆排序;算法;堆重建;數據比較次數;時間復雜度

0 引言

  堆實質是一棵完全二叉樹,其任何一非葉節點滿足性質:(ki≤k2i,ki≤k2i+1)或(ki≥k2i,ki≥k2i+1)(i=1,2,3,4,…,n/2)。利用堆進行排序是一種高效的排序方法,它的時間復雜度為T(n)=2nlog2n+O(n)[1],而且沒有什么最壞情況導致堆排序的運行明顯變慢,同時它的空間復雜性為O(1)[2]。排序算法的優劣衡量標準主要由排序的時間開銷決定,而時間開銷主要由數據的比較次數和數據移動次數決定。理論已經推導出該算法的時間復雜度已經到達了比較排序的時間復雜度下限[3],那么只能降低其時間復雜度的主項系數來提高該算法的效率。參考文獻[3]改進算法與本文算法有些相似之處,但根據參考文獻[3]的實驗數據可知其算法的效率提高了10%左右,而本文中效率提高達到了20%左右。王曉東在《最優堆排序算法》一文中并沒有給出實驗結果,只是從理論上分析了時間復雜度。王珞在《堆排序的推廣改進》一文中雖然效率提高較大,但空間復雜度也提高了,算法也比較復雜。為此,本文在保持傳統算法優點的前提下提出了一種簡單有效的算法來提高效率,并由實驗數據證明算法改進的有效性。

1 問題描述

001.jpg

  傳統的堆排序分為兩步:(1)根據初始輸入數據,利用堆的調整算法形成初始堆;(2)通過一系列的元素交換和重新調整堆進行排序[2]。排序過程如圖1所示。

  在上述過程中不難發現:每次形成最大堆后交換堆頂與堆末元素(記為tail),再逐步做下滑調整重建堆。下滑調整的目的是使大數上浮一層(即使較小的數下滑一層),在該算法中每次下調比較次數是2,移動一次數據。在每次交換數據時,把較小的數放到最頂端,使整個序列又處于比較壞的情況,這無疑增加了許多不必要的數據移動。那么能否為這個被交換的元素(tail)找到它合適的位置再插進去?根據堆的性質可以知道:堆頂的元素被移走后,新的堆頂的元素肯定是它的左右子女中較大的一個??梢圆唤粨Q數據,先將堆末元素取走,把堆頂元素直接放在堆末元素的位置,在它的子女中找到較大的那個子女上移一層,重復這個動作直到葉節點,這樣在每一層比較中只需要比較一次。

2 算法思路與描述

  2.1 改進的算法思路

  在最大堆生成后,令tail=堆末元素(即先取走堆末元素),堆頂元素放在堆末的位置,則堆頂變為空節點?,F在開始把除堆末節點以外的元素重建最大堆,比較空節點左右子女的大小,將較大的那個子女放在空節點的位置,取走的那個子女為新的空節點,重復這個動作直到葉節點。將tail的值填充在空節點。比較原空節點(tail)的值與其父節點的大小,如果父節點較大則不變,反之交換兩個元素的值。

  改進的堆排序算法過程如圖2所示。

002.jpg

  2.2 tail位置的確定

  在上述過程中,需要證明一個問題,即如何在過程最后只比較一次tail的值與父節點的大小就可確定tail的位置。

003.jpg

  證明過程如下。設圖3(a)中的堆為最大堆,則已知:tail=g,c>g,按照上述規則,a放在g的位置,則a為空節點?,F在假設b>c,則b>g,那么b放在圖3(a)中a節點的位置,d、e中較大的元素放在圖3(a)中b節點的位置(設d較大),則現在圖3(a)中d節點的位置為空節點,用tail(即g)的值填充?,F在比較d與g的大小,若g大則結果如圖3(b)所示,是符合最大堆的條件的。將假設設為相反的條件,也是同理。所以只需要比較一次tail的值與父節點的大小即可確定tail的位置。

  2.3 算法描述

  該算法用C++語言描述,核心代碼如下:

  template<class T>

  void MaxHeap<T>::HeapSort()

  {

  createMaxHeap(arr);//創建初始堆

  T tail=0;

  int j=1;

  for(int i=currentSize-1;i>=0;i--)

  {

  if(i<2)

  if(heap[0]>heap[1])

  {

  swap(0,1);

  break;

  }

  int m=0,n=1;

  tail=heap[i];//取出堆末元素

  heap[i]=heap[0];//堆頂元素放在堆末

  while(n+1<i)//重建堆

  {

  if(heap[n]>heap[n+1])

  //找到子女中較大的使其上升

  heap[m]=heap[n];

  else

  {

  heap[m]=heap[n+1];

  n++;}

  m=n;n=2*n+1;//進行下一個子樹的重建

  }

  if(tail>heap[(m-1)/2])//確定tail的位置

  {

  heap[m]=heap[(m-1)/2];

  heap[(m-1)/2]=temp;

  }

  else heap[m]=tail;}

  };

3 算法復雜度分析與結果對比

  3.1 數據移動次數計算

  本文中初始堆的建立和數據移動次數與傳統算法一致,所以在此主要是比較數據的比較次數。設二叉樹有n個節點,對應的完全二叉樹的深度為k=log2n+1」。每一次堆重建在二叉樹的每一層都會比較1次,所以要進行k次比較。在整個過程中需要進行n-2次堆的重建,所以數據需要比較k*(n-2)次,每次確定tail位置需要比較一次,共(n-2)次,在最后還需要加上兩個節點的情況,比較2次,所以改進的排序算法數據比較次數為T=nlog2n-2log2n+n。傳統堆排序堆重建的最多比較次數為T=2nlog2n+4n+8[1]。通過兩種算法相比較可知,改進的堆排序算法的比較次數在主項系數上少了一半。

  3.2 實驗結果對比

  為了證實相應的結論,比較改進的算法與傳統算法之間的效率,在VC6.0環境下用rand()函數產生不同量的隨機數,用QueryPerformanceFrequency()函數獲取算法的計算時間。每組數據是測量的10組數據的平均值,做出兩種算法時間的直方圖,如圖4所示。由圖4可知,提高的效率(時間差/傳統算法時間)分別為18.4%、14.2%、  21.9%、19.0%、24.2%、18.6%、17.1%、15.1%,平均值為18.6%,所以效率提高了20%左右。

4 結論

004.jpg

  通過上述分析,傳統的堆排序在堆重建過程中最壞情況下數據比較次數為T=2nlog2n+4n+8,已經達到該類算法時間復雜度數量級下限,因此本文中對算法的改進體現在降低算法中數據比較次數。在理論分析中改進的算法在最壞情況下數據比較次數為T=nlog2n-2log2n+n,可以得到改進算法在主項系數上為傳統算法的一半。通過實驗結果對比可知,改進算法在效率上提高了20%左右,并且該算法在空間復雜性上依舊為O(1),保持了傳統算法的優點,表明該算法的改進是有效的。

參考文獻

  [1] 盧開澄.算法與復雜性[M].北京:高等教育出版社,1995.

  [2] 殷人昆.數據結構(用面向對象方法與C++語言描述)(第二版)[M].北京:清華大學出版社,2007.

  [3] 唐開山.堆排序算法研究[J].紹興文理學院學報,2004,24(10):16-18.


此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          欧美激情二区三区| 欧美视频一区二区| 亚洲自拍电影| 国产日韩亚洲欧美| 国产精品日韩一区二区三区| 国产精品一卡二卡| 在线观看日韩av先锋影音电影院| 亚洲一区亚洲二区| 美女脱光内衣内裤视频久久影院| 欧美丝袜第一区| 亚洲香蕉在线观看| 久久欧美中文字幕| 国产一区二区三区久久| 欧美一级片一区| 欧美高清视频一区| 欧美日韩激情网| 欧美成人久久| 亚洲高清视频在线| 免费成人在线观看视频| 久久久久免费视频| 欧美在线视频二区| 欧美xx69| 国产亚洲一区二区精品| 红桃视频国产一区| 激情伊人五月天久久综合| 日韩视频免费观看高清在线视频| 亚洲亚洲精品三区日韩精品在线视频| 国产精品视频九色porn| 亚洲国产欧美久久| 久久九九精品99国产精品| 欧美日韩亚洲一区| 欧美aⅴ一区二区三区视频| 亚洲欧洲精品一区二区三区| 在线观看视频免费一区二区三区| 久久久久九九九九| 精品福利免费观看| 亚洲欧洲一级| 亚洲二区精品| 国产精品红桃| 欧美精品免费看| 欧美国产视频在线| 国产精品视频在线观看| 国产精品入口日韩视频大尺度| 国产欧美一区二区白浆黑人| 欧美成人自拍视频| 欧美二区在线播放| 麻豆成人在线播放| 亚洲国产精品专区久久| 美女诱惑黄网站一区| 久久一区二区精品| 亚洲国产精品专区久久| 欧美成年人网| 久久综合色播五月| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美成人免费小视频| 欧美亚洲一区| 久久久国产精品一区二区中文| 欧美精品精品一区| 欧美亚洲视频| 亚洲国产一区二区三区a毛片| 久久精品男女| 女仆av观看一区| 亚洲人成在线观看| 欧美日韩1080p| 国产日韩欧美夫妻视频在线观看| 亚洲精品日产精品乱码不卡| 国产一区二区精品久久91| 亚洲精品五月天| 国产一级揄自揄精品视频| 永久免费视频成人| 久久精品导航| 日韩视频中午一区| 国产精品五月天| 亚洲视频精品在线| 欧美成人嫩草网站| 久久精品久久99精品久久| 久久久爽爽爽美女图片| 欧美日本一区| 欧美极品在线观看| 性欧美videos另类喷潮| 亚洲国产精品第一区二区三区| 亚洲一区二区三区精品在线观看| 欧美亚洲免费高清在线观看| 欧美一二三区精品| 欧美日韩国产综合视频在线观看| aa日韩免费精品视频一| 欧美日韩中文字幕综合视频| 国产精品日日摸夜夜摸av| 国产亚洲精品成人av久久ww| 欧美激情精品久久久久久蜜臀| 影音欧美亚洲| 亚洲欧美日本国产专区一区| 欧美一区二区免费| 久久精品成人欧美大片古装| 亚洲国产高清在线观看视频| 亚洲高清视频一区| 一区二区电影免费在线观看| 欧美国产精品劲爆| 亚洲精品中文字幕有码专区| 欧美性jizz18性欧美| 欧美日韩三级视频| 欧美日韩高清在线播放| 国产视频一区在线观看一区免费| 国产一区二区高清| 中国亚洲黄色| 亚洲午夜激情在线| 亚洲第一天堂无码专区| 久久中文精品| 亚洲精品网站在线播放gif| 国产精品久久久久久久久| 欧美1级日本1级| 欧美精品乱人伦久久久久久| 亚洲精品字幕| 欧美激情日韩| 久久久噜噜噜久久中文字幕色伊伊| 亚洲视频欧美在线| 国产日韩欧美一区二区三区四区| 亚洲精品欧美专区| 亚洲高清免费视频| 99re6这里只有精品视频在线观看| 久久久久久久久久久久久9999| 欧美日韩成人在线视频| 久久精品视频免费播放| 亚洲一二三区在线观看| 久久岛国电影| 久久精彩免费视频| 亚洲电影免费观看高清完整版在线| 国产手机视频一区二区| 亚洲激情小视频| 另类图片综合电影| 国产精品日韩欧美综合| 一本色道久久综合亚洲精品按摩| 欧美一区二区三区成人| 狂野欧美激情性xxxx欧美| 亚洲视频一区二区| 亚洲高清久久| 国产在线精品一区二区中文| 国产日韩视频一区二区三区| 欧美一区日本一区韩国一区| 欧美一区二区三区另类| 国产嫩草一区二区三区在线观看| 欧美一区二区三区视频在线| 欧美成人一区二区三区片免费| 亚洲天堂av综合网| 99国产精品久久久久久久久久| 篠田优中文在线播放第一区| 亚洲综合色噜噜狠狠| 国产精品久久久久久妇女6080| 亚洲第一区在线| 久久精品国产亚洲高清剧情介绍| 亚洲午夜日本在线观看| 中文一区字幕| 亚洲综合成人在线| 国内一区二区在线视频观看| 99re66热这里只有精品4| 欧美三级电影一区| 亚洲免费av网站| 亚洲影院色无极综合| 国产性天天综合网| 一本色道久久| 国产精品亚洲а∨天堂免在线| 亚洲国产精品99久久久久久久久| 久久福利视频导航| 亚洲人成网站777色婷婷| 欧美日韩福利在线观看| 国产精品私房写真福利视频| 久久夜色精品国产噜噜av| 国产一区二区三区久久久久久久久| 欧美日韩亚洲一区二区| 国产精品久久久久9999| 亚洲一级二级在线| 亚洲自拍啪啪| 鲁鲁狠狠狠7777一区二区| 亚洲激情黄色| aa级大片欧美| 久久久久国产精品一区三寸| 欧美一区二区国产| 国产精品美女www爽爽爽| 亚洲国产高清高潮精品美女| 亚洲第一在线综合在线| 欧美高清一区二区| 欧美色图天堂网| 欧美视频在线不卡| 国产亚洲精品成人av久久ww| 亚洲黄色性网站| 久久久久久九九九九| 欧美成人免费视频| 国产精品一区=区| 国产日韩亚洲| 亚洲激情一区二区三区| 亚洲欧美精品suv| 亚洲一级片在线观看| 国产精品欧美激情| 国产亚洲精品激情久久| 亚洲一区精品电影| 欧美日韩精品免费在线观看视频| 欧美在线免费观看视频| 久久久久在线观看| 99精品国产热久久91蜜凸| 亚洲精品一区二区三区在线观看| 国产精品一区=区| 欧美14一18处毛片| aa亚洲婷婷| 欧美一区二区成人| 亚洲自拍三区| 欧美人交a欧美精品| 亚洲男人的天堂在线aⅴ视频| 国产精品一区一区| 国产精品久久午夜| 精品91久久久久| 久久久久久免费| 国产精品任我爽爆在线播放| 在线观看久久av| 欧美国产日韩在线观看| 欧美人牲a欧美精品| 欧美 日韩 国产 一区| 国产精品久久久亚洲一区| 亚洲一二区在线| 午夜精品久久久久影视| 国产九九精品视频| 毛片基地黄久久久久久天堂| 欧美日韩一区在线| 国产欧美日韩精品a在线观看| 国产精品国产a级| 亚洲精品国产精品乱码不99| 一本色道久久精品| 久久久青草婷婷精品综合日韩| 国产日产高清欧美一区二区三区| 久久福利一区| 国产精品videossex久久发布| 亚洲人成在线播放| 国产精品视频导航| 久久久精品免费视频| 欧美日韩亚洲视频一区| 一区二区三区在线观看国产| 亚洲一区二区三区精品动漫| 亚洲伦理中文字幕| 日韩系列在线| 国产精品爽爽爽| 欧美一区二区三区视频| 国产精品一区二区三区成人| 欧美日韩免费区域视频在线观看| 欧美系列电影免费观看| 亚洲一区网站| 欧美手机在线| 欧美视频一区二区三区四区| 亚洲精品视频中文字幕| 亚洲国产精品成人综合色在线婷婷| 欧美极品一区| 欧美一区二区三区久久精品茉莉花| 国产精品二区三区四区| 亚洲精品久久久久久下一站| 久久视频这里只有精品| 欧美午夜视频| 欧美破处大片在线视频| 国产精品xxx在线观看www| 久久久久久国产精品一区| 久久精品首页| 久久久久九九九九| 久久成人一区二区| 亚洲国产一区在线观看| 欧美成人乱码一区二区三区| 国产尤物精品| 欧美精品在线播放| 国产日韩欧美自拍| 欧美日韩国产综合在线| 欧美激情亚洲自拍| 国内偷自视频区视频综合| 亚洲精品视频免费在线观看| 亚洲欧美国内爽妇网| 欧美国产精品劲爆| 欧美精品国产| 国产欧美日本一区二区三区| 噜噜噜在线观看免费视频日韩| 激情久久中文字幕| 国产亚洲激情在线| 亚洲国产高潮在线观看| 亚洲社区在线观看| 国产一区二区丝袜高跟鞋图片| 欧美视频国产精品| 亚洲欧美一区在线| 亚洲欧洲美洲综合色网| 亚洲欧美视频一区二区三区| 国产欧美一区二区精品婷婷| 欧美在线影院在线视频| 正在播放亚洲一区| 亚洲欧美第一页| 亚洲素人一区二区| 亚洲久久成人| 欧美激情一区二区三区在线| 亚洲精品123区| 美日韩免费视频| 国产精品五区| 久久精品72免费观看| 亚洲国产成人精品视频| 欧美三级特黄| 欧美日韩成人网| 性色av一区二区三区在线观看| 日韩视频久久| 在线视频亚洲一区| 久久在线视频在线| 国产欧美日韩高清| 亚洲人成网在线播放| 亚洲福利小视频| 欧美电影电视剧在线观看| 国产一区二区三区av电影| 亚洲国产99| 亚洲宅男天堂在线观看无病毒| 欧美日韩亚洲视频| 国产精品久久7| 亚洲精选国产| 亚洲在线免费观看| 亚洲福利视频免费观看| 欧美美女操人视频| 最新国产乱人伦偷精品免费网站| 久久一区二区三区超碰国产精品| 亚洲高清一区二| 国产精品影音先锋| 久久性色av| 免费短视频成人日韩| 99精品视频网| 亚洲日本国产| 欧美久久久久久久| 亚洲全黄一级网站| 欧美日韩午夜视频在线观看| 国产精品a久久久久久| 亚洲观看高清完整版在线观看| 羞羞漫画18久久大片|