堆是用來表示元素集合的一種資料結構。與「堆記憶體」不同。堆的性質,第一:順序性:任何結點的值都小於或者等於其子結點的值,這意味著最小元素位於根結點。
最大頂堆跟這個相反。第二個性質是形狀:一種二叉樹,最底層的葉子結點盡可能靠左分布,如果有n個結點,那麼所有結點到根的距離不會超過logn。
下面用vector來實現堆:
我們規範的從下標1開始,函式定義如下:
root=1;
value(i)=x[i];
leftchild(i)=2*i;
rightchild(i)=2*i+1;
parent(i)=i/2;兩個關鍵函式:siftup和siftdown。
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
int tmp[12]=;
vectorx;
void siftup(int n)
}void siftdown(int n)
;vectorx;
void siftup(int n)
}void siftdown(int n)
}void siftdown(int n)
for(int i=1;i!=x.size();i++)cout<
由於是最小堆,所以排序後是降序排序。
程式設計珠璣 讀書筆記 堆的實現及堆排序
堆是用來表示元素集合的一種資料結構。與 堆記憶體 不同。堆的性質,第一 順序性 任何結點的值都小於或者等於其子結點的值,這意味著最小元素位於根結點。最大頂堆跟這個相反。第二個性質是形狀 一種二叉樹,最底層的葉子結點盡可能靠左分布,如果有n個結點,那麼所有結點到根的距離不會超過logn。下面用vect...
程式設計珠璣讀書筆記 堆排序,小根堆
堆排序的關鍵是要實現siftup和siftdown。當建立完這兩個函式以後,排序乙個陣列只需要5行 演算法執行了n 1次siftup和siftdown,而每次操作的成本最多o lgn 所以執行時間為o nlogn include include define max 20 void swap int...
《程式設計珠璣》 讀書筆記
程式設計珠璣 讀書筆記 婁雨禛pb16060356 準確的問題描述 很多時候,我們總是過度關注了解決問題所用的巧妙演算法,而將問題本身的重要性忽視。當我們拿到乙個問題時,應當反覆研讀問題的每乙個細節,因為正是這些細節的細微偏差導致了我們在解決問題時方案與技巧的重大不同。如果我們只花很少的時間研讀問題...