算法導論—堆排序C++實現

原理見算法導論第三版第六章:

以下是c++版本:

<span style="font-size:18px;">#include <iostream>
#include <vector>
using namespace std;
#define uint unsigned int
void MaxHeapify(vector<int> &Array,int i);
void main()
{
	int num;
	vector<int> Array;
	vector<int> AfterSort;
	while(cin>>num)
		Array.push_back(num);
	cout<<"Before sort:"<<endl;
	for(vector<int>::iterator first=Array.begin(),last=Array.end();first!=last;first++)
		cout<<*first<<","<<flush;
	cout<<endl;
	cout<<"After sort:"<<endl;
	for(int i=Array.size()/2-1;i>=0;--i)
		MaxHeapify(Array,i);
	for (int i=Array.size()-1;i>=0;--i)  //剛開始將i定義爲uint類型,結果死循環
	{
		int tmp;
		tmp=Array[0];
		if (Array.size()==2 && Array[0]>Array[1])    //此處做了些修改,照着書上寫過來有問題,最後做了些調整
		{ 
			Array[0]=Array[1];
		}
		else
		{
			Array[0]=Array[i];
			Array[i]=tmp;
		}

		AfterSort.push_back(tmp);
		Array.pop_back();
		MaxHeapify(Array,0);
	}
	vector<int>::iterator first=AfterSort.begin(),last=AfterSort.end();
	while (first!=last)
	{
		cout<<*first<<","<<flush;
		first++;
	}
	cout<<endl;
}
void MaxHeapify(vector<int> &Array,int i)
{
	uint child=(uint)(2*i+1);
	if(child<Array.size())
	{
		uint r_child=child+1;
		if(r_child<Array.size() )
			if (Array[child]<Array[r_child])
				child=r_child;
		if (Array[i]<Array[child])
		{
			int tmp=Array[i];
			Array[i]=Array[child];
			Array[child]=tmp;
			MaxHeapify(Array,child);
		}
	} 
}</span>


C版本:

<span style="font-size:18px;">#include <stdio.h>
#define MaxSize 100
void HeapSort_C(int *Array,int n);
void Sift(int *Array,int low,int max) ;
void main()
{
	int n=4,num;
	int Array[]={0,1,8,9,2};
	printf("Input data:");
	for(int i=1;i<=n;i++)
		printf("%d,",Array[i]);
	printf("\nAfter sort:");
	HeapSort_C(Array,n);
	for(int i=1;i<=n;i++)
		printf("%d,",Array[i]);
	printf("\n");
}
void HeapSort_C(int *Array,int n)
{
	int i,tmp;
	for(i=n/2;i>=1;i--)       //輸入數據第一位必須是一個無效位
		Sift(Array,i,n);
	for (i=n;i>1;i--)
	{
		tmp=Array[1];
		Array[1]=Array[i];
		Array[i]=tmp;
		Sift(Array,1,i-1);
	}
}
void Sift(int *Array,int low,int max)   //建堆
{
	int i=low,j=2*i;
	int tmp=Array[i];
	while (j<=max)
	{
		if(j<max && Array[j]<Array[j+1])
			j++;
		if (tmp<Array[j])    //以i爲根的子樹
		{
			Array[i]=Array[j];
			i=j;
			j=2*i;
		}
		else
			break;
	}
	Array[i]=tmp;
}</span>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章