堆排序算法

堆排序是利用堆进行排序的算法

将待排序的序列构造成一个大顶堆(或小顶堆),此时序列 的最大值就是堆顶的根结点

将其与堆数组中的未尾元素交换,此时未尾元素就是最大 值,然后将剩余的n - 1个序列重新构造成一个大顶堆,如些反复便能得到一个有序的序列

#ifndef HEAPSORT_H
#define HEAPSORT_H
template<class T> void HeapAdjust(T *a,int n,int len) //建立大顶堆
{
	T temp = a[n];
	for(int j = n * 2;j < len;j *= 2)
	{
		if(j < len - 1 && a[j] < a[j + 1]) //如果结点的左孩子小于右孩子增加j的值
			++j; //用于记录较大的结点的下标
		if(temp >= a[j]) //如果父结点大于等于两个孩子,则满足大顶堆的定义,跳出循环
			break;
		a[n] = a[j];  //否则用较大的结点替换父结点
		n = j; //记录下替换父结点的结点下标
	}
	a[n] = temp; //把原来的父结点移动到替换父结点的结点位置
}
template<class T> void Swap(T *a,T *b) //交换两个数值
{
	T temp = *a;
	*a = *b;
	*b = temp;
}
template<class T> void HeapSort(T *a,int len) //堆排序算法
{
	for(int i = len / 2;i >= 0;--i) //建立大顶堆
		HeapAdjust(a,i,len);
	for(int i = len - 1;i > 0;--i)
	{
		Swap(&a[i],&a[0]); //第个元素和最后一个元素进行交换
		HeapAdjust(a,0,i); //建立大顶堆
	}
}
#endif //HEAPSORT_H


 

测试代码:

#include "HeapSort.h"
#include <stdio.h>
int main()
{
	int a[] = {12,45,34,37,66,15,6,4,17,19,25,35,3,2,1};
	int len = sizeof(a) / sizeof(*a);
	HeapSort(a,len);
	printf("排序后的数组序列为:\n");
	for(int i = 0;i < len;++i)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值