您的位置:首页 > 其它

算法练习二 堆排序

2011-04-20 08:53 183 查看
// HeapSort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define random(x) (rand()%x)
#define LEFT(i)  ( i << 1)
#define RIGHT(i) ( ( i << 1 ) + 1 )
#define PARENT(i) ( i >> 1 )
/*
数组下标统一从1开始,第0位置不使用。
如果数组有10个元素从Ary[0] - Ary[9]
那么aryLen = 9 只使用 Ary[1] - Ary[9]
*/
void HeapSort(int ary[]);
void BuildMaxHeap(int ary[]);
void MaxHeapify(int ary[], int i);
int AryLen = 0;
int HeapSize = 0;
int _tmain(int argc, _TCHAR* argv[])
{
int num = 10;
cout << "请输入需要排序数组的长度,数组将随机生成:" <<endl;
cin >> num;
int* arry =  new int[num+1];
srand( (int)time(0) );
for ( int x=1; x<num+1; x++ )
{
arry[x] = random(10000);
cout << arry[x] << endl;
}
AryLen = num;

HeapSort( arry );
//
cout << endl << "after sort " << endl;
for( int i=1; i<num+1; i++ )
{
cout << arry[i] << "/t";
}
delete[] arry;

system("pause");
return 0;
}
void HeapSort(int ary[])
{
BuildMaxHeap( ary );
cout << "after BuildMaxHeap" << endl;
int j=0;
for ( j=1; j<=AryLen; j++)
{
cout << ary[j] << "/t";
}

HeapSize = AryLen;
int i = AryLen;
for( ; i>=2; i--)
{

int temp = ary[1];
ary[1] = ary[i];
ary[i] = temp;
HeapSize = HeapSize - 1;
MaxHeapify(ary,1);
}
}
/*
构造最大堆
子数组Ary[ (arylen >> 1 + 1)....arylen ] 中的元素都是树中的叶子,因此每个都可看作是只含一个元素的堆。
过程BuildMaxHeap对树中的每一个其他结点都调用一次MaxHeapify.
*/
void BuildMaxHeap(int ary[])
{

int i = AryLen;
i = i >> 1;

HeapSize = AryLen;
for ( ; i>=1; i--)
{
MaxHeapify( ary, i );
}
}
/*
保持最大堆性质
@i: 数组下标从1开始
*/
void MaxHeapify( int ary[], int i)
{
int left = LEFT( i );
int right = RIGHT( i );
int largest = 0;
if ( left <= HeapSize && ary[left] > ary[i] )
{
largest = left;
}
else
{
largest = i;
}
if ( right <= HeapSize && ary[right] > ary[largest] )
{
largest = right;
}
if ( largest != i )
{
//cout << "ary[" <<i<< "]=" << ary[i]  << "ary["<<largest<<"]=" <<ary[largest] << "/t";
int temp = ary[i];
ary[i] =  ary[largest];
ary[largest] =  temp;

MaxHeapify( ary, largest);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: