堆排序算法的实现

#include<stdio.h>

//调整堆
void Swap(int *a, int pos1, int pos2);
void HeapAdjust(int *a, int i, int size)
{
	int lchild = LeftChild(i);
	int rchild = RightChild(i);
	int largest = i; 
	
	if(lchild < size && a[lchild] > a[largest])  
	{ 
		largest = lchild;  
	} 
	else  
	{ 
		largest = i;   
	}
	if(rchild < size && a[rchild] > a[largest])   
	{ 
		largest = rchild;   
	}  
	 
	if(largest != i)  
	{ 
		Swap(a, i, largest);//交换 
		HeapAdjust(a,largest,size);  
	}   
}			

int LeftChild(int pos)
{
	return pos * 2 + 1; 
}

int RightChild(int pos)
{
	return pos * 2 + 2;  
} 

void Swap(int *a, int pos1, int pos2)
{
	int tmp = a[pos1]; 
	a[pos1] = a[pos2]; 
	a[pos2] = tmp; 
}

//建立并调整堆
void Build_Max_Heap(int *a, int size)
{
	int i; 
	for(i = (size / 2); i >= 0; i--) 
	{
		HeapAdjust(a,i,size);
	}
}

void Heap_Sort(int *a, int size)
{
	Build_Max_Heap(a,size);
	int length = size; 
	int i; 
	for(i = length - 1; i >= 1; i--)
	{
		Swap(a, 0, i);
		size = size - 1;
		HeapAdjust(a,0,size);
	}
}

void main(void)
{
	int a[] = {2,6,9,1,0,5,3,4,7,8};
	int size = 10;
	Heap_Sort(a,size);
	int i;
	for(i = 0; i < size; i++) 
	{ 
		printf("%d ",a[i]);
	}
	printf("\n");
}
    该算法用最大堆排序算法对数据进行排序,主要的步骤是1、建立堆 2、调整堆中数据的位置.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值