3.堆排序
4.總結
堆是一種特殊的樹,滿足一下兩種條件:
(1)堆是一顆完全的二叉樹。
(2)堆中的某個結點的值都不大於(或不小於)其左右孩子的結點的值。
其中,根結點最大的堆叫做大頂堆,根結點最小的叫做小頂堆。
堆是一種完全二叉樹,因為完全二叉樹的節點比較緊湊,只有最後一層是不滿的,所以使用陣列是最節省空間的。當用陣列來儲存完全二叉樹的時候,從下標1開始儲存。
下標0不儲存元素的原因:可以很方便地找到父節點,父節點 = 結點數/2.
堆也是完全二叉樹,但是元素每個節點的值都不大於(或不小於)其父節點的值。
插入元素以後,也要繼續維持堆的兩個特性:
(1)堆是一顆完全的二叉樹。
(2)堆中的某個結點的值都不大於(或不小於)其左右孩子的結點的值。
為了滿足條件(1),所有先把元素插入到最後乙個節點後面的位置。但是這時候不再滿足條件(2),就需要重新堆化(自下而上):
在完全二叉樹中,插入的節點和父節點比較,如果比父節點小(大),就交換兩個節點的位置,然後再繼續往上的父節點相比。直到比父節點打(小)為止。
在插入元素過程中,每次和n(2^x)位置進行比較,所以複雜度為o(log n)。在刪除堆頂元素的時候,一般堆頂元素是最小的或者最大的元素。在刪除以後為了繼續滿足堆得兩個性質,就可以把最後乙個元素移到根結點。然後再堆化:(自上而下的堆化)
移到堆頂以後就和左右結點中最小的(最大的)交換位置,依次向下,知道比其他左右子結點都小(都大)為止。
在刪除元素的過程中,每次和 2n 和(2n+1) 位置的元素比較,所以刪除元素的時間複雜度也為o(log n)。就是先模擬從堆中新增元素,第乙個不用排序,直接插進去,然後就先插進去再進行堆化。
完全二叉樹的高度h=log n,且第h層有1個元素,第(h-1)層有2個元素,第(h-2)層有22個元素,…,第1層有2(h-1)個元素。
建堆的時間就是o(n)。
堆排序的基本思想就是:將待排序的序列構成乙個大頂堆。此時,整個序列中最大的值就是堆頂的根結點。吧根結點移走(也就是把這個和堆末尾的元素交換,這時候最後乙個元素就是最大的元素),然後把剩餘的n-1個序列重新構造成乙個堆,這樣子就會得到乙個剩下的元素中的最大值。
也就是不停地刪除元素,直到把n個元素都刪除,就會得到乙個排序後的陣列。
刪除乙個元素時間複雜度是o(log n),那麼刪除n個元素的時間複雜度約等於 o(nlog n)。
因為不占用別的空間,只用了乙個交換元素的乙個臨時變數,所以堆排序的空間複雜度為o(1)。
(1)堆是乙個完全二叉樹。
(2)大(小)堆中的每乙個結點都不小於(不大於)它的父節點。
(3)插入和刪除元素的時間複雜度都是o(log n)。
(4)建立堆的時間複雜度是o(n)。
(5)堆排序的時間複雜度是o(nlog n),空間複雜度是o(1).
本部落格總結自掘金——源哥讀原始碼(戳我前往)主要是為了自己好理解和總結,覺得不詳細的可以戳鏈結前往檢視。
排序總結 堆排序
created by liyuanshuo on 2017 3 17.include heap sort.h 堆的定義 kik 2i k i k 2i 1 若以一維陣列儲存堆,則堆對應乙個完全二叉樹,並且所有的非葉節點的值均不大於 或者不小於 其子女的值 根節點 堆頂元素 的值是最小的 或者最大的 ...
堆排序總結
在面試中遇到要你手寫堆排序,可以先詢問是否可以使用stl中建堆的演算法,問清楚面試官的意圖之後方可動手寫 交流最重要。heap並不屬於stl元件,是乙個幕後英雄,stl實現了最大堆,預設的元素比較方式是less,如果要使用小根堆,則將比較方式設定為greater,並用來作為priority queu...
堆排序總結
演算法基於順序儲存的 完全二叉樹 結點i的左孩子是2i 右孩子是2i 1 父節點是i 2 編號小於n 2的結點都是分支結點。大根堆 根 左 右 小根堆 根 左 右 建堆 編號 n 2的所有結點依次 下墜 調整 自底向上處理分支結點 調整規則 小元素逐層 下墜 與關鍵字更大的孩子交換 排序 將棧頂元素...