首先,我們來認識堆:
堆的建立:將給定的序列按層次遍歷建立完全二叉樹,然後從最後乙個非終端結點開始自下向上逐步調整為堆。
這裡就有兩個重要的操作,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 每個結點的左子樹和右子樹都是乙個二叉堆...