堆排序,快速排序,歸併排序都是遞迴排序,且時間都為o(nlog(n)).
先講解一下什麼是資料結構中的二叉堆。
定義:
二叉堆是完全二叉樹或者近似完全二叉樹,滿足兩個特性:
1:父節點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。
2:每個節點的左子樹和右子樹都是乙個二叉堆。
當父節點的鍵值總是大於等於任何乙個子節點的鍵值時為最大堆。
下面給出堆排序的**:
void _merge_sort(int
array, int i, int n)
if(array[j] >= temp_value)
array[i] = array[j];
i = j;
j = 2 * i + 1;
}array[i] = temp_value;
}void merge_sort(int
array, int n)
}
注釋:
1:_merge_sort(int array, int i, int n)函式:
該函式作用是將i為根節點的陣列調整為堆陣列(前提是i的子節點都是堆)(自己在草稿紙上對資料畫出堆的形式比較好理解)
舉例如下:對陣列[6,1,3,4,7,8,5],其根節點6的左右子節點都是堆。根據此函式,可以將改數字調整為堆。[1,4,3,6,7,8,5].()
2:void merge_sort(int array, int n)函式將乙個陣列排序分為兩步
(1):第乙個for迴圈,將陣列進行堆化處理。
例子[5,7,4,1,3,0,6],從最後乙個根節點4開始,利用1中函式構建堆。[5,7,0,1,3,4,6]
在for迴圈中重複上述操作,對根節點為7的陣列構建堆。[5,1,0,7,3,4,6].
重複上述操作,直到根節點為5時,構建堆之後結束。[0,1,4,7,3,5,6].陣列已堆化。
(2):(1)一中已堆化的陣列為最小堆,進行排序則將根節點0與陣列最後乙個數互換,[6,1,4,7,3,5,0],接著將除最後一數0以外的陣列調整為堆,重複上述操作,每一次可將最小值至於該陣列最後,可完成排序。在[6,1,4,7,3,5],對話後變成[1,3,4,7,6,5],—>[5,3,4,7,6,1]—>[3,5,4,7,6]—>[6,5,4,7,3]—>[4,5,6,7]—>[7,5,6,4]—>[5,7,6]—>[6,7,5]—>[7,6]—>[7];模擬了該堆化陣列的排序過程。
加上每一次的最小值,即可完成整個排序[7,6,5,4,3,1,0]
總結:
堆排序理解起來比較困難,舉例子相對好很多。
關於堆的插入,堆的刪除,堆的構建,堆的排序更詳細,更通俗易懂,請參看部落格
重新教自己學演算法之遞迴排序 快速排序(四)
int quick sort int array,int start,int end while i j array i temp value i if i j array i temp value return i void quick sort int array,int start,int e...
排序演算法 堆排序(遞迴版本)
堆積排序 heapsort 是指利用堆積樹 堆 這種資料結構所設計的一種排序演算法。堆積樹是乙個近似完整二叉樹的結構,並同時滿足堆積屬性 即子結點的鍵值或索引總是小於 或者大於 它的父結點。在堆積樹的資料結構中,堆積樹中的最大值總是位於根節點。堆積樹中定義以下幾種操作 1.最大堆積調整 max he...
排序演算法之堆排序
前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...