日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

经典排序之 堆排序

發(fā)布時間:2024/7/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 经典排序之 堆排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

開了個公眾號「aCloudDeveloper」,專注技術干貨分享,期待與你相遇。

Author: bakari ?Date: 2012.7.30

排序算法有很多種,每一種在不同的情況下都占有一席之地。關于排序算法我分“經(jīng)典排序之”系列分別述之。本篇為堆排序。

堆排序是運用二叉樹建立的一種排序方式,分為兩個階段,建堆和排序。

看建堆過程:

1 /*********************************************** 2 * Author:bakari Date:2012.7.29 3 * 堆排序 4 * 中心算法:關注建堆的過程 5 * i節(jié)點的子孩子節(jié)點為 2i+1 和 2i+2; 6 ***********************************************/ 7 //建立堆的數(shù)據(jù)結構,此為最大堆 8 void HeapSort::Build_Heap(int current,int last) 9 { 10 int child = 2 * current + 1; 11 int temp = HeapList[current]; 12 while(child <= last) 13 { 14 15 if (child < last && HeapList[child] < HeapList[child + 1]) child ++; //找到孩子節(jié)點中最大的節(jié)點 16 if (temp > HeapList[child]) break; //當前節(jié)點大于他的孩子節(jié)點說明滿足最大堆的特點直接跳出循環(huán) 17 else 18 { 19 HeapList[current] = HeapList[child]; //否則將當前節(jié)點與孩子節(jié)點交換 20 current = child; //將孩子節(jié)點替換當前節(jié)點 21 child = current * 2 + 1; //繼續(xù)在孩子節(jié)點中找 22 } 23 } 24 HeapList[current] = temp; 25 }

上面有一處小技巧, i 節(jié)點 的子孩子節(jié)點為 2 i + 1 和 2 i + 2;這個是建堆的關鍵,上面算法建立的是最大堆,當然也可以建立最小堆,方法類似。

?

OK,堆一旦建好,就可以進行排序了:

1 void HeapSort::Heap_Sort() 2 { 3 for(int i = (len - 2)/2;i >= 0;i--) 4 Build_Heap(i,len-1); 5 for (int i = len -1;i > 0; i--) 6 { 7 Swap(0,i); 8 Build_Heap(0,i-1); 9 } 10 }

轉載于:https://www.cnblogs.com/bakari/archive/2012/08/11/2633692.html

總結

以上是生活随笔為你收集整理的经典排序之 堆排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。