標籤:art pac water 個數 技術 堆排序 details 表示 輸入
之前的部落格介紹介紹了數組的兩種排序演算法:插入排序和歸併排序(採用遞迴),見連結http://blog.csdn.net/u013165521/article/details/46845033。
本篇部落格,介紹還有一種排序演算法:堆排序。
(內容參照演算法導論)
一、堆的概念
所謂堆,它是一個數組,也能夠被看成一個近似的全然二叉樹。樹上每一個結點相應數組的一個元素。二元堆積分為二種:最大堆和最小堆。本文主要介紹最大堆,最小堆類似。最大堆的特點:對於隨意某個結點,該結點的值大於左孩子、右孩子的值,可是左右孩子的值沒有要求。
二、堆排序演算法 堆排序演算法調用函數Build_max_heap將輸入數組array[1..n]建立成堆。當中n表示數組長度。由於建立堆後,數組的最大元素被存放在根節點A[1],通過將A[1]與數組最後一個元素進行交換。將最大元素後移,實現排序。
可是,交換後新的根節點可能不滿足堆的特點,所以須要調用子函數Max_heapify對剩餘的數組元素進行最大堆性質的維護。堆排序演算法。通過不斷反覆這個過程(n-1)次,實現數組的從小到大排序(由於採用最大堆)。
對於上面提及的兩個子函數進行簡要介紹。
函數Build_max_heap的作用:建堆。
由於子數組A(n/2+1..n)是樹的葉子節點,不須要進行堆的維護。
所以。僅僅須要對A[1..n/2]數組元素進行維護。就可構建堆。 函數Max_heapify的作用:維護堆。過程:如果A[i]表示樹的某個結點,則A[2*i]是其左孩子,A[2*i+1]是其右孩子。接下來,比較三者大小挑選出最大元素的下標,存放於largest。然後。推斷(largest==i)嗎。若不滿足則進行元素交換。將大的元素上移。
此時,以A[largest]為根節點的子樹可能不滿足堆的性質,所以須要遞迴調用自身。
三、演算法實現 上面介紹堆實現數組排序的原理,以下直接給出原始碼。
#include <stdlib.h>#include <stdio.h>#include <iostream>using namespace std;void Swap(int *x, int *y);void Max_heapify(int array[], int i, int heap_size);void Build_max_heap(int array[],int len);void Heapsort(int array[],int len);void Swap(int *x, int *y){int temp;temp=*x;*x=*y;*y=temp;}void Max_heapify(int array[], int i, int heap_size){int largest;int _left=2*i;int _right=2*i+1;if (_left<=heap_size && array[_left]>array[i]){largest=_left;}elselargest=i;if (_right<=heap_size && array[_right]>array[largest]){largest=_right;}if (largest!=i){Swap(&array[largest],&array[i]);Max_heapify(array,largest,heap_size);}}void Build_max_heap(int array[],int len){int heap_size=len;for (int i=len/2; i>=1; i--){Max_heapify(array,i,heap_size);}}void Heapsort(int array[],int len){int heap_size=len;Build_max_heap(array,len);for (int i=len; i>=2; i--){Swap(&array[1],&array[i]);heap_size--;Max_heapify(array,1,heap_size);}}void main(){int array[]={0,14,10,8,7,9,3,2,4,1};int len=9;Heapsort(array,len);cout<<"heap sort result:\n";for (int i=1; i<=len; i++){cout<<array[i]<<" ";}cout<<endl;}
實驗結果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
堆排序(C語言實現)