堆的基本操作與堆排序

2021-09-26 20:24:51 字數 614 閱讀 8916

堆排序堆是一顆完全二叉樹,樹中每個結點的值都不小於(或不大於)其左右孩子的值。

向下調整

完全二叉樹葉子結點的個數為n/2(向上取整),在[1,n/2]範圍內為非葉子結點。倒著列舉能夠保證每個結點都是以其為根結點的子樹中權值最大的結點,父結點一旦發現子結點的權值都比自己小就可以終止向下調整,這樣downadj()才是合理的。

//high一般為堆最後乙個元素的下標

void downadj(int low, int high)

if(heap[j] > heap[i])

else

}} void createheap()

}//刪除堆頂元素

void deletetop()

向上調整
//新增乙個元素一般放在陣列最後,然後應進行向上調整 

//low一般為1

void upadj(int low, int high)

else break;

} }

//新增元素

void insert(int x)

void heapsort()

}

堆操作與堆排序

首先,我們來認識堆 堆的建立 將給定的序列按層次遍歷建立完全二叉樹,然後從最後乙個非終端結點開始自下向上逐步調整為堆。這裡就有兩個重要的操作,shift up int t 和shift down int t 這樣我們就建立了堆。對於堆排序,就相當於每次取出堆頂的元素值,這樣是從大到小排序的,因為建立...

堆的幾個基本操作以及堆排序

include using namespace std 堆是一顆完全二叉樹,如果父親結點大於等於孩子結點,那麼就是大頂堆 如果父親結點小於等於孩子結點,那麼就是小頂堆 這裡以大頂堆為例 const int maxn 100 int heap maxn n 10 向下調整,low指的是欲調整的陣列下標...

堆與堆排序

二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時...