一直以爲堆排的實現會很困難,書上的原理解釋那麼長,結果實現起來代碼會如此的簡短。
/*堆排,創建大根堆*/
/*從小大到排列*/
#include<iostream>
using namespace std;
//Heap 堆
void HeapAdjust(int heap[],int n,int length){
int tmp=heap[n];
for(int i=n*2;i<length;i*=2){
if(i==0) i=1;//下標爲零的情況
if(i<length-1&&heap[i]<heap[i+1] ) i++;//找出兩個子結點中最大的值
if(tmp>heap[i]) break;//如果子結點都比父結點小,退出
heap[n]=heap[i];
n=i;//更改下標交換位置,避免重複交換浪費時間
}
heap[n]=tmp;
}
void HeapSort(int heap[],int length){
for(int i=length/2-1;i>=0;i--)//從最大的,有葉子結子的點開始調整
HeapAdjust(heap,i,length);
for(int i=length-1;i>0;i--){
int tmp=heap[0];heap[0]=heap[i];heap[i]=tmp;//將第一個結點與最後一個結點交換位置
HeapAdjust(heap,0,i-1);//交換後,左右子樹都是大根堆,這時只需調整根結點即可
}
}
int main(){
int array[]={1,3,5,7,9,0,8,6,4,2,-1,10,8,-9,5};
int length=sizeof(array)/4;
HeapSort(array,length);
for(int i=0;i<length;i++)
cout<<array[i]<<" ";
}
轉載請標明出處,原文http://blog.csdn.net/ccy0815ccy