堆操作與堆排序

2021-08-23 12:16:46 字數 975 閱讀 5989

首先,我們來認識堆:

堆的建立:將給定的序列按層次遍歷建立完全二叉樹,然後從最後乙個非終端結點開始自下向上逐步調整為堆。

這裡就有兩個重要的操作,shift_up(int t)和shift_down(int t),這樣我們就建立了堆。

對於堆排序,就相當於每次取出堆頂的元素值,這樣是從大到小排序的,因為建立的是大頂堆。堆排序是一種樹型

選擇排序。

現在來詳細說一點:比如對於序列:5 8 9 7 6 4

按照層次遍歷建立完全二叉樹得到:

然後自底向上調整為大頂堆。

對於插入操作,是在原來堆的後面加上被插入的元素,然後自下而上調整堆,每次操作複雜度為o(log(n))。

對於刪除操作,就是把位於堆最後的那個元素覆蓋到被刪除元素的位置,然後調整堆,堆的size--。

而對於堆排序,就是每次刪除堆頂元素,把每次刪除的元素值儲存在s裡,刪除完畢後得到序列是乙個有序序列,

也就是完成了排序,這樣可以知道堆排序的時間複雜度為o(nlog(n))。

#include

#include

#include

using namespace std;

const int n = 105;

int heap[n];

int size;

void shift_up(int t)

}void shift_down(int t)

}void insert(int x)

void delete(int t)

int delete_maxval()

int main()

return 0;

}

堆與堆排序

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

堆與堆排序

堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。堆排序是就地排序,輔助空間為o 1 它是不穩定的排序方法。排序的穩定性是指如果在排序的序列中,存在前後相同的兩個元素的話,排序前 和排序後他們的相對位置不發生變化 先說說什麼是堆,堆通常是乙個可以被看做一棵樹的陣列物...

堆與堆排序

堆排序與快速排序,歸併排序一樣都是時間複雜度為o n logn 的幾種常見排序方法。學習堆排序前,先講解下什麼是資料結構中的二叉堆。二叉堆是完全二叉樹或者是近似完全二叉樹。二叉堆滿足二個特性 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆...