C 堆排序 建立最大堆類實現堆排序

2021-10-19 08:21:07 字數 3553 閱讀 3617

class

maxheap

//建立新陣列

int* temp =

newint

[newlength]

;//複製

for(

int index =

1; index < oldlength; index++

)delete

old;

old = temp;

}public

:maxheap

(int capacity =10)

//插入元素

void

push

(int element)

//獲取要新增的節點位置的索引

//並將元素個數+1

int currentnode =

++heapsize;

//當不是根節點且根節點元素小於插入的元素

while

(currentnode !=

1&& element > heap[currentnode /2]

) heap[currentnode]

= element;

}//返回優先順序最高的元素

inttop()

return heap[1]

;}//刪除最大的元素

void

pop(

)int lastelement = heap[heapsize--];

int currentnode =1;

int child =2;

while

(child <= heapsize)

if(lastelement > heap[child]

) heap[currentnode]

= heap[child]

; currentnode = child;

child *=2

;}heap[currentnode]

= lastelement;

}//將乙個陣列初始化為最大堆

void

initialize

(int

* array,

int size)

//如果根元素大於最大的孩子,就直接結束迴圈

if(rootele >= heap[child]

)//如果根元素比最大的孩子小,就將孩子上移

heap[child /2]

= heap[child]

;//移到下一層,直到為根元素找到合適的位置

child *=2

;}//將原本的根元素放到合適的位置上去

heap[child /2]

= rootele;}}

friend ostream&

operator

<<

(ostream& cout, maxheap& m);}

;ostream&

operator

<<

(ostream& cout, maxheap& m)

return cout;

}

void

heapsort

(int a,

int size)

}

隨機數範圍為0-max(使用者手動輸入)

#include

#include

using

namespace std;

//最大堆類

class

maxheap

//建立新陣列

int* temp =

newint

[newlength]

;//複製

for(

int index =

1; index < oldlength; index++

)delete

old;

old = temp;

}public

:maxheap

(int capacity =10)

//插入元素

void

push

(int element)

//獲取要新增的節點位置的索引

//並將元素個數+1

int currentnode =

++heapsize;

//當不是根節點且根節點元素小於插入的元素

while

(currentnode !=

1&& element > heap[currentnode /2]

) heap[currentnode]

= element;

}//返回優先順序最高的元素

inttop()

return heap[1]

;}//刪除最大的元素

void

pop(

)int lastelement = heap[heapsize--];

int currentnode =1;

int child =2;

while

(child <= heapsize)

if(lastelement > heap[child]

) heap[currentnode]

= heap[child]

; currentnode = child;

child *=2

;}heap[currentnode]

= lastelement;

}//將乙個陣列初始化為最大堆

void

initialize

(int

* array,

int size)

//如果根元素大於最大的孩子,就直接結束迴圈

if(rootele >= heap[child]

)//如果根元素比最大的孩子小,就將孩子上移

heap[child /2]

= heap[child]

;//移到下一層,直到為根元素找到合適的位置

child *=2

;}//將原本的根元素放到合適的位置上去

heap[child /2]

= rootele;}}

friend ostream&

operator

<<

(ostream& cout, maxheap& m);}

;ostream&

operator

<<

(ostream& cout, maxheap& m)

return cout;

}//對陣列a進行堆排序

void

heapsort

(int a,

int size)

}int

main()

//進行堆排序

heapsort

(a, n)

;//輸出結果

for(

int index =

1; index <= n; index++

)}

最大堆實現堆排序

堆排序 這裡使用的是最大堆 思想 1 將當前的堆轉換成最大堆 從最大的非葉子結點開始,1 判斷根結點和左右結點的大小交換相互的位置,使得該子樹成為最大堆,每次交換成功後就繼續往該結點的子結點去重複 1 操作,直到根結點後再去下乙個非葉子結點,直到根結點 2 轉成最大堆後,每次就將第乙個結點互最後乙個...

最大堆排序 C

堆排序是一種複雜度為o nlog n 的一種高效的排序,這裡將展示最大堆的排序演算法。堆排序是將陣列抽象化成為乙個完全二叉樹。這裡對 a 10 抽象的二叉樹結構如下 1 下面三個節點是得到左子節點,右子節點,和父節點。intleft inti 返回左兒子 intright inti 返回右兒子 in...

最大堆 排序

解除安裝最前面,下面的所有討論都是基於二叉堆 一 什麼是堆 堆是乙個陣列結構,可以看著為一顆完全二叉樹,把這顆完全二叉樹按層從上到下,每層從左至右編序號,每個序號所對應的元素即為陣列中該序號的元素 該樹出最後一層以外每一層都排滿,最後一層從左至右,先左孩子再右孩子排列,如果有父節點沒有排滿孩子 無孩...