經典算法--堆排

一直以爲堆排的實現會很困難,書上的原理解釋那麼長,結果實現起來代碼會如此的簡短。

/*堆排,創建大根堆*/
/*從小大到排列*/
#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


發佈了37 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章