C 資料結構之堆 上濾下濾以及用於排序

2021-09-21 06:37:17 字數 2747 閱讀 6078

#includeusing namespace std; /* * 堆,就是一棵完全二叉樹,物理儲存方式是陣列,一般情況下,都犧牲第乙個元素arr[0],剩下的就滿足了從1開始計數 * 若堆從1開始計數,那麼對於乙個節點i,2*i是它的左孩子,2*i+1是它的右孩子 * 對的最基本操作,包括上濾和下濾 * 上濾是指:h(1,n-1)是堆,h(1,n)不是堆,因此通過將arr[n]元素上濾,來達到調整堆的目的 * 下濾是指:h(2,n)是堆,h(1,n)不是堆,因此通過將arr[1]元素下濾,來達到調整堆的目的 */ #define heap_size 10 //這裡,我要要建乙個堆,堆裡面要放10個元素 #define arr_size (heap_size+1) //之前說過,堆預設的實現是犧牲掉第0個元素 #define heapelemtype int //定義堆的元素型別 //heapelemtype heaparray[arr_size];//堆的儲存空間 /* * 大頂堆,上面的,是最大的 * 堆的基本操作:上濾 * h(1,n-1)是堆,h(1,n)非堆,也就是說,只要調整第n個元素,就是乙個新堆了 * 注意:n是當前可用元素的最大下標,它是不能超過arr_size的 */ void shiftup(heapelemtype heaparray, int n) heaparray[n] = tmp; } /* * 大頂堆,上面的,是最大的 * 堆的基本操作:下濾 * h(2,n)是堆,h(1,n)不是堆,也就是所,只要調整第1個元素,就是乙個新的大頂堆 * 注意:n是當前堆中元素的最大下表,是不能超過arr_size的 */ void shiftdown(heapelemtype heaparray, int first, int n) heaparray[father] = tmp; } void printheaparr(const heapelemtype heaparray, const int n) //第二步,交換第乙個節點(最大值)和末尾節點,然後調整除了末尾節點的其他節點為乙個新大頂堆 for(tmp=n;tmp>1;tmp--) } void main()

heaparray[n

]=tmp;

}/* * 大頂堆,上面的,是最大的

* 堆的基本操作:下濾

* h(2,n)是堆,h(1,n)不是堆,也就是所,只要調整第1個元素,就是乙個新的大頂堆

* 注意:n是當前堆中元素的最大下表,是不能超過arr_size的

*/void

shiftdown

(heapelemtype  

heaparray

,int

first

,intn)

heaparray

[father]=

tmp;

}void

printheaparr

(const

heapelemtype  

heaparray

,const

intn

)

cout

<<

endl

; }

void

swap

(heapelemtype  

heaparray

,inti,

intj

) /*

* 堆排序:用堆的屬性,即大頂堆最頂部的就是最大的節點

* 因此我們可以每次將根節點和末尾節點交換,然後將除了末尾節點的其他節點重新調整乙個堆,然後迴圈

* 在做上一步之前,需要將雜亂的節點調整成乙個堆

*/void

heapsort

(heapelemtype  

heaparray

,intn)

//第二步,交換第乙個節點(最大值)和末尾節點,然後調整除了末尾節點的其他節點為乙個新大頂堆

for(

tmp=n;

tmp>1;

tmp--

) }

void

main()

;

intn=5

;

printheaparr

(heaparray,n

);shiftup

(heaparray,n

);printheaparr

(heaparray,n

);cout

<<

"下濾"

<<

endl

;

heapelemtype  

heaparraysec

[arr_size]=

; n=

5;printheaparr

(heaparraysec,n

);shiftdown

(heaparraysec,1

,n);

printheaparr

(heaparraysec,n

);cout

<<

"排序"

<<

endl

;

heapelemtype  

heaparraysort

[arr_size]=

; n=

6;printheaparr

(heaparraysort,n

);heapsort

(heaparraysort,n

);printheaparr

(heaparraysort,n

);system

("pause");

}

C 資料結構之樹

樹在資料結構是乙個極其重要的存在,例如二叉樹,排序二叉樹,平衡二叉樹,紅黑樹等等在許多專案中運用比較廣,而且也是平時考察的重點,所以今天就來系統地談一談樹 樹 定義 n個結點的有限集合,當n等於0時,稱為空樹,n個結點的樹只有n 1條邊,有如下性質。有且僅有乙個特定的稱為根的結點 當n 1時,其餘結...

C 資料結構之串

串 string 是n n 0 個字元組成的有限序列。由於串中的字元都是連續儲存的,在c 中有恆定不變的特性。一經建立就保持不變。為了區別c 中的string,因此以stringds類模擬string的資料結構,如下 class stringds set 建構函式 public stringds c...

資料結構之鏈式佇列以及C 實現與模板

佇列,一種特殊的線性表 特點 只允許在一端輸入,在另一端輸出。輸入端稱為隊尾,輸出端稱為隊頭 因此,佇列,又稱為先進先出表 fifo 類似於生活中的排隊,先來的排在前頭,後來的排在後頭,乙個乙個辦理業務。佇列有兩種,一種叫做迴圈佇列 順序佇列 另一種叫做鏈式佇列。這一篇講的是鏈式佇列,迴圈佇列在另外...