堆排 heapsort

       堆数据结构是一种数组对象,它可以被视为一棵完全二叉树。表示堆的数组A是一个两个属性的对象:length[A]是数组中的元素个数,heap-size[A]是存放在A中的堆的元素个数,heap-size[A]<=length[A]。树的根为A[1],给定了某个节点的下标i,其父结点Parent(i)、左儿子Left(i)和右儿子Right(i)的下标可以简单的计算出来: 

Parent(i)
   return⌊i/2⌋
Left( i )
   return 2i
Right( i ) 
   return 2i+1


代码如下:

#include <iostream>
#include <math.h>


static int length;
static int Heap_Size;


inline int Left( int &i )
{
	return 2*i;
}


inline int Right( int &i )
{
	return 2*i+1;
}


inline int Parent( int &i )
{
	return floor(i/2);
}


void Max_Heapify( int *A, int i )
{
	int l,r,largest;
	l = Left(i);
	r = Right(i);
	if( l <= Heap_Size && A[l] > A[i] )                  
		largest = l;
	else
		largest = i;
	if( r <= Heap_Size && A[r] > A[largest] )            
		largest = r;
	if( largest != i )
	{
		int temp = A[i];
		A[i] = A[largest];
		A[largest] = temp;


		Max_Heapify( A, largest );
	}
}


void Min_Heapify( int *A, int i )
{
	int l,r,smallest;
	l = Left(i);
	r = Right(i);
	if( l <= Heap_Size && A[l] < A[i] )                 
		smallest = l;
	else
		smallest = i;
	if( r <= Heap_Size && A[r] < A[smallest] )           
		smallest = r;
	if( smallest != i )
	{
		int temp = A[i];
		A[i] = A[smallest];
		A[smallest] = temp;


		Min_Heapify( A, smallest );
	}
}


void Build_Max_Heap( int *A )
{
	Heap_Size = length;                                 
	for( int i = floor(length/2); i >= 1; --i )
	{
		Max_Heapify( A, i );
	}
}


void Build_Min_Heap( int *A )
{
	Heap_Size = length;                                 
	for( int i = floor(length/2); i >= 1; --i )
	{
		Min_Heapify( A, i );
	}
}


void HeapSort( int *A )
{
	Build_Max_Heap( A );
	for( int i = length; i >= 2; --i )
	{
		int temp = A[1];
		A[1] = A[i];
		A[i] = temp;
		Heap_Size--;
		Max_Heapify( A, 1 );
	}
} 


void print( int *A, int n )
{
	for( int i = 1; i <= n; i++ )
	{
		std::cout << A[i] << " ";
	}
	std::cout << std::endl;
}


int main( int argc, char* argv[] )
{
	std::cout << " input the length of the array: ";
	std::cin >> length;
	int *A;
	A = new int[length+1];
	for( int i = 1; i < length+1; i++ )
	{
		std::cin >> A[i];
	}


	HeapSort( A );
	print( A, length );
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值