急求資料結構程式設計之「堆排序十萬火急

時間 2021-10-14 22:19:38

1樓:飲水思春

/*這個演算法的實現沒有按照書上的做法,書的演算法變數太多,且命名混亂,不容易分析和理解,所以我採用了嚴蔚敏版的演算法.

另外,書中在排序開始時是講,所有的排序都是從小到大的排序,但現在的做法是將小的結點放在了陣列的後面,又沒有說明.

*/#include "stdafx.h"

#include

#include

int const count=8;

typedef struct

records;

typedef records list[count+1];

//堆的首結點調整

//在r中,大於s的節點都已經滿足堆的性質,即r[s+1],r[s+2]..r[m],只有r[s]是使堆不成立的結點,那麼這裡就只調整它

void heapadjust(list & r,int s,int m)

//將上次的父結點改為這次較大結點的,即交換了父結點與孩子結點,然後另下次迴圈的父結點指向這次的較大結點

r[s].key=r[j].key;

s=j;

}//將首個使堆不成立的結點插入到合適的位置

r[s].key=key;

}/**//*

學習堆排序首先要搞清楚完全二叉樹的性質和特點.

在完全二叉樹中,可對各層進行編號,編號排列的結果就是乙個一維的陣列,這個一維的樹組也正是我們這裡要排序的陣列

如果只有這個樹組,那麼這個陣列所對應的完全二叉樹之間有這樣的關係:所有的父結點必需是不大於n/2的值,所以在首次建堆的時候,從以count/2開始,然後一層層的建堆.

另外,對於第i個元素,2i是它的左子樹,2i+1是它的右子樹,如果2i>n,則這個結點沒有左子樹,同理2i+1>n則這個結點沒有右子樹,這在heapadjust

中有著重要的意義,這是用來判斷迴圈結束,以及確定延哪個子結點方向繼續調整的關鍵

*/void heapsort(list & r)

for(i=count;i>1;i--)

}void printlist(list r)

*/r[1].key=70;

r[2].key=73;

r[3].key=69;

r[4].key=23;

r[5].key=93;

r[6].key=18;

r[7].key=11;

r[8].key=68;

cout<<"輸入的序列為:"<

printlist(r);

heapsort(r);

cout<<"快速排序後的序列為:"<

printlist(r);

return 0;}

2樓:寶寶嘟嘟

堆排序是利用堆的特性進行排序的過程.

堆排序的基本思路是:把n個記錄存於向量r之中,把它看成完全二叉樹,此時關鍵字序列不一定滿足堆關係.堆排序大體分兩步處理;

一:初建堆.

二:堆排序.

求資料結構與演算法分析,求《資料結構與演算法分析 C語言描述》原書第二版的中文版課後答案,萬分感謝

知兒網團隊 資料結構與演算法分析 c語言描述 原書第2版 pdf 您好,資源不易找,請及時採納。謝謝。求資料結構與演算法分析 c語言描述第二版 mark allen weiss 中文版的習題答案 10 混太極 我有答案,郵箱給我發給你。給分哦。 瘋丄子 王紅梅資料結構答案.doc要就發郵箱 資料結構...

資料結構快速排序問題,C語言資料結構 快速排序的問題 5

由於你傳遞的l是值傳遞,在快速排序內部出現了一個名字一樣的區域性變數,只是區域性變數被排序了,並不是傳入的變數被排序,可以採用傳地址的方式解決,或者不定義形參,直接採用全域性變數。我使用前者幫你實現了 再者,快速排序 有點問題,幫你修改了下 include include define maxsiz...

這些資料結構填空題怎麼寫,求資料結構填空題的程式碼怎麼填 題幹如圖,需要填兩個空。用佇列知識。 50

聽不清啊 的清晰度太差,第5題實在是看不清了 沒有辦法,愛莫能助 1 關係 圖 2 隊尾 隊首 3 11 4 o 1 o n 已知長度為n時 5 看不清 文庫精選 內容來自使用者 jy0211120 1 把資料儲存到計算機中,並具體體現資料之間的邏輯結構稱為物理 儲存 結構。2 設有一個不帶頭結點的...