重新教自己學演算法之遞迴排序 堆排序(六)

2021-07-02 18:56:32 字數 1361 閱讀 3847

堆排序,快速排序,歸併排序都是遞迴排序,且時間都為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 則...