n涓叧閿瓧搴忓垪Kl錛孠2錛?#8230;錛孠n縐頒負(fù)鍫嗭紝褰撲笖浠呭綋璇ュ簭鍒楁弧瓚沖涓嬫ц川(綆縐頒負(fù)鍫嗘ц川)錛?
(1) ki≤K2i涓攌i≤K2i+1 鎴?2)Ki≥K2i涓攌i≥K2i+1(1≤i≤ )
鑻ュ皢姝ゅ簭鍒楁墍瀛樺偍鐨勫悜閲廟[1..n]鐪嬪仛鏄竴媯靛畬鍏ㄤ簩鍙夋爲(wèi)鐨勫瓨鍌ㄧ粨鏋勶紝鍒欏爢瀹炶川涓婃槸婊¤凍濡備笅鎬ц川鐨勫畬鍏ㄤ簩鍙夋爲(wèi)錛氭爲(wèi)涓換涓闈炲彾緇撶偣鐨勫叧閿瓧鍧囦笉澶т簬(鎴栦笉灝忎簬)鍏跺乏鍙沖瀛?鑻ュ瓨鍦?緇撶偣鐨勫叧閿瓧銆?
銆愪緥銆戝叧閿瓧搴忓垪(10錛?5錛?6錛?5錛?0錛?0)鍜?70錛?6錛?0錛?5錛?5錛?0)鍒嗗埆婊¤凍鍫嗘ц川(1)鍜?2)錛屾晠瀹冧滑鍧囨槸鍫嗭紝鍏跺搴旂殑瀹屽叏浜屽弶鏍?wèi)鍒嗗埆濡倿畯鏍瑰爢绀轰緥鍜屽ぇ鏍瑰爢绀轰緥鎵紺恒?
2銆佸ぇ鏍瑰爢鍜屽皬鏍瑰爢
鏍圭粨鐐?浜︾О涓哄爢欏?鐨勫叧閿瓧鏄爢閲屾墍鏈夌粨鐐瑰叧閿瓧涓渶灝忚呯殑鍫嗙О涓哄皬鏍瑰爢銆?
鏍圭粨鐐?浜︾О涓哄爢欏?鐨勫叧閿瓧鏄爢閲屾墍鏈夌粨鐐瑰叧閿瓧涓渶澶ц咃紝縐頒負(fù)澶ф牴鍫嗐?
娉ㄦ剰錛?
鈶犲爢涓換涓瀛愭爲(wèi)浜︽槸鍫嗐?
鈶′互涓婅璁虹殑鍫嗗疄闄呬笂鏄簩鍙夊爢(Binary Heap)錛岀被浼煎湴鍙畾涔塳鍙夊爢銆?
3銆佸爢鎺掑簭鐗圭偣
鍫嗘帓搴?HeapSort)鏄竴鏍?wèi)迮為夋嫨鎺掑簭銆?
鍫嗘帓搴忕殑鐗圭偣鏄細(xì)鍦ㄦ帓搴忚繃紼嬩腑錛屽皢R[l..n]鐪嬫垚鏄竴媯靛畬鍏ㄤ簩鍙夋爲(wèi)鐨勯『搴忓瓨鍌ㄧ粨鏋勶紝鍒╃敤瀹屽叏浜屽弶鏍?wèi)涓弻浜簿l撶偣鍜屽瀛愮粨鐐逛箣闂寸殑鍐呭湪鍏崇郴銆愬弬瑙佷簩鍙夋爲(wèi)鐨勯『搴忓瓨鍌ㄧ粨鏋勩戯紝鍦ㄥ綋鍓嶆棤搴忓尯涓夋嫨鍏抽敭瀛楁渶澶?鎴栨渶灝?鐨勮褰曘?
4銆佸爢鎺掑簭涓庣洿鎺ユ彃鍏ユ帓搴忕殑鍖哄埆
鐩存帴閫夋嫨鎺掑簭涓紝涓轟簡(jiǎn)浠嶳[1..n]涓夊嚭鍏抽敭瀛楁渶灝忕殑璁板綍錛屽繀欏昏繘琛宯-1嬈℃瘮杈冿紝鐒跺悗鍦≧[2..n]涓夊嚭鍏抽敭瀛楁渶灝忕殑璁板綍錛屽張闇瑕佸仛n-2嬈℃瘮
杈冦備簨瀹炰笂錛屽悗闈㈢殑n-2嬈℃瘮杈冧腑錛屾湁璁稿姣旇緝鍙兘鍦ㄥ墠闈㈢殑n-1嬈℃瘮杈冧腑宸茬粡鍋氳繃錛屼絾鐢變簬鍓嶄竴瓚熸帓搴忔椂鏈繚鐣欒繖浜涙瘮杈冪粨鏋滐紝鎵浠ュ悗涓瓚熸帓搴忔椂鍙堥噸澶嶆墽琛?
浜?jiǎn)杩欎簺姣旇緝鎿嶄綔銆?
鍫嗘帓搴忓彲閫氳繃鏍?wèi)迮灳l撴瀯淇濆瓨閮ㄥ垎姣旇緝緇撴灉錛屽彲鍑忓皯姣旇緝嬈℃暟銆?
5銆佸爢鎺掑簭
鍫嗘帓搴忓埄鐢ㄤ簡(jiǎn)澶ф牴鍫?鎴栧皬鏍瑰爢)鍫嗛《璁板綍鐨勫叧閿瓧鏈澶?鎴栨渶灝?榪欎竴鐗瑰緛錛屼嬌寰楀湪褰撳墠鏃犲簭鍖轟腑閫夊彇鏈澶?鎴栨渶灝?鍏抽敭瀛楃殑璁板綍鍙樺緱綆鍗曘?br>
1 /*
2 鍫嗘帓搴?br> 3 (1)鐢ㄥぇ鏍瑰爢鎺掑簭鐨勫熀鏈濇兂
4 鈶?nbsp;鍏堝皢鍒濆鏂囦歡R[1..n]寤烘垚涓涓ぇ鏍瑰爢錛屾鍫嗕負(fù)鍒濆鐨勬棤搴忓尯
5 鈶?nbsp;鍐嶅皢鍏抽敭瀛楁渶澶х殑璁板綍R[1](鍗沖爢欏?鍜屾棤搴忓尯鐨勬渶鍚庝竴涓褰昍[n]浜ゆ崲錛?br> 6 鐢辨寰楀埌鏂扮殑鏃犲簭鍖篟[1..n-1]鍜屾湁搴忓尯R[n]錛屼笖婊¤凍R[1..n-1].keys≤R[n].key
7 鈶?nbsp;鐢變簬浜ゆ崲鍚庢柊鐨勬牴R[1]鍙兘榪濆弽鍫嗘ц川錛屾晠搴斿皢褰撳墠鏃犲簭鍖篟[1..n-1]璋冩暣涓哄爢銆?br> 8 鐒跺悗鍐嶆灝哛[1..n-1]涓叧閿瓧鏈澶х殑璁板綍R[1]鍜岃鍖洪棿鐨勬渶鍚庝竴涓褰昍[n-1]浜ゆ崲錛?br> 9 鐢辨寰楀埌鏂扮殑鏃犲簭鍖篟[1..n-2]鍜屾湁搴忓尯R[n-1..n]錛屼笖浠嶆弧瓚沖叧緋籖[1..n- 2].keys≤R[n-1..n].keys錛?br>10 鍚屾牱瑕佸皢R[1..n-2]璋冩暣涓哄爢銆?br>11 ……
12 鐩村埌鏃犲簭鍖哄彧鏈変竴涓厓绱犱負(fù)姝€?br>13 (2)澶ф牴鍫嗘帓搴忕畻娉曠殑鍩烘湰鎿嶄綔錛?br>14 鈶?nbsp;鍒濆鍖栨搷浣滐細(xì)灝哛[1..n]鏋勯犱負(fù)鍒濆鍫嗭紱
15 鈶?nbsp;姣忎竴瓚熸帓搴忕殑鍩烘湰鎿嶄綔錛氬皢褰撳墠鏃犲簭鍖虹殑鍫嗛《璁板綍R[1]鍜岃鍖洪棿鐨勬渶鍚庝竴涓褰曚氦鎹紝鐒跺悗灝嗘柊鐨勬棤搴忓尯璋冩暣涓哄爢(浜︾О閲嶅緩鍫?銆?br>16 娉ㄦ剰錛?br>17 鈶犲彧闇鍋歯-1瓚熸帓搴忥紝閫夊嚭杈冨ぇ鐨刵-1涓叧閿瓧鍗沖彲浠ヤ嬌寰楁枃浠墮掑鏈夊簭銆?br>18 鈶$敤灝忔牴鍫嗘帓搴忎笌鍒╃敤澶ф牴鍫嗙被浼鹼紝鍙笉榪囧叾鎺掑簭緇撴灉鏄掑噺鏈夊簭鐨勩?br>19 鍫嗘帓搴忓拰鐩存帴閫夋嫨鎺掑簭鐩稿弽錛氬湪浠諱綍鏃跺埢錛屽爢鎺掑簭涓棤搴忓尯鎬繪槸鍦ㄦ湁搴忓尯涔嬪墠錛?br>20 涓旀湁搴忓尯鏄湪鍘熷悜閲忕殑灝鵑儴鐢卞悗寰鍓嶉愭鎵╁ぇ鑷蟲暣涓悜閲忎負(fù)姝€?nbsp;
21 */
22
23 //鐢熸垚澶ф牴鍫?/span>
24 void HeapAdjust(int SortData[],int StartIndex, int Length)
25 {
26 while(2*StartIndex+1 < Length)
27 {
28 int MinChildrenIndex = 2*StartIndex+1 ;
29 if(2*StartIndex+2 < Length )
30 {
31 //姣旇緝宸﹀瓙鏍?wèi)鍜屽彌_瓙鏍?wèi)锛岃褰曟渶澶у肩殑Index
32 if(SortData[2*StartIndex+1]<SortData[2*StartIndex+2])
33 {
34 MinChildrenIndex = 2*StartIndex+2;
35 }
36 }
37 if(SortData[StartIndex] < SortData[MinChildrenIndex])
38 {
39 //浜ゆ崲i涓嶮inChildrenIndex鐨勬暟鎹?/span>
40 int tmpData =SortData[StartIndex];
41 SortData[StartIndex] =SortData[MinChildrenIndex];
42 SortData[MinChildrenIndex] =tmpData;
43 //鍫嗚鐮村潖錛岄渶瑕侀噸鏂拌皟鏁?/span>
44 StartIndex = MinChildrenIndex ;
45 }
46 else
47 {
48 //姣旇緝宸﹀彸瀛╁瓙鍧囧ぇ鍒欏爢鏈牬鍧忥紝涓嶅啀闇瑕佽皟鏁?/span>
49 break;
50 }
51 }
52
53 return;
54 }
55
56 //鍫嗘帓搴?/span>
57 void HeapSortData(int SortData[], int Length)
58 {
59 int i=0;
60
61 //灝咹r[0,Lenght-1]寤烘垚澶ф牴鍫?/span>
62 for (i=Length/2-1; i>=0; i--)
63 {
64 HeapAdjust(SortData, i, Length);
65 }
66
67 for (i=Length-1; i>0; i--)
68 {
69 //涓庢渶鍚庝竴涓褰曚氦鎹?/span>
70 int tmpData =SortData[0];
71 SortData[0] =SortData[i];
72 SortData[i] =tmpData;
73 //灝咹.r[0..i]閲嶆柊璋冩暣涓哄ぇ鏍瑰爢
74 HeapAdjust(SortData, 0, i);
75 }
76
77 return;
78 }
CODE:http://www.shnenglu.com/Files/bujiwu/HeapSort.rar
鍙傝冩枃绔狅細(xì)
http://www.cnblogs.com/xiaotao823/articles/1055399.html
http://zhidao.baidu.com/question/1003067.html

]]>