#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 類似於生活中的排隊,先來的排在前頭,後來的排在後頭,乙個乙個辦理業務。佇列有兩種,一種叫做迴圈佇列 順序佇列 另一種叫做鏈式佇列。這一篇講的是鏈式佇列,迴圈佇列在另外...