堆排序

堆排序是在堆的基础上排序呢,如果要升序排序就要建大堆,如果要降序排序就要建小堆,时间复杂度为O(N*lgN)。
#include<iostream>
using namespace std;
#include<cstdlib>
#include<cassert>
//#include"Heap.h"

//仿函数==>函数对象
template<class T>
struct Up
{
	bool operator()(const T& m,const T& n)    //建大堆
	{
		return m<n;
	}
};
template<class T>
struct Down
{
	bool operator()(const T& m,const T& n)    //建小堆
	{
		return m>n;
	}
};
template<class T,class compare>
void _AdjustDown(T* a,size_t parent,size_t size)
{
		size_t child=parent*2+1;   //指向左节点
		while(child<size)
		{
			if((child<size-1)&&compare()(a[child],a[child+1]))
				++child;   //指向右节点
			if(compare()(a[parent],a[child]))
			{
				swap(a[parent],a[child]);
				parent=child;
				child=parent*2+1;
			}
			else
				break;
		}
}
template<class T>
void HeapSort(T* a,size_t size)
{
	//建堆
	assert(a);

		//找倒数第一个叶子节点
    for(int i=(size-2)/2;i>=0;--i)
	{
	    //向下调整
	     _AdjustDown<T,Down<T>>(a,i,10);
    }
	size_t End=size;
	while(End>0)
    {
		swap(a[0],a[End-1]);
		--End;
		_AdjustDown<int,Down<int>>(a,0,End);
	}
	
}
void TestHeapSort()
{
	int a[]={10,16,18,12,11,13,15,17,14,19};
	HeapSort(a,10);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值