堆排序的实现

/*
堆用数组实现,起始下标为0,故父节点为n时,左孩子为2*n+1,右孩子为2*n+2
*/
#define LEN 510000
#include<time.h>
#include<algorithm>
#include<iostream>
void swap(int &a, int& b)
{
	int t = a;
	a = b;
	b = t;
}
//给定一个位置,从这个位置开始调整堆
void build(int num[], int pos, int length)
{
	int left = 2*pos+1;//左孩子的位置
	while(left < length)
	{		
		int right = left+1;
		int index = left;
		if(right < length && num[right] > num[left])
		{
			index = right;
		}
		if(num[pos] > num[index])
			break;
		swap(num[pos],num[index]);

		pos = index;
		left = index*2+1;
	}
}
//构建一个大根堆
void buildHeap(int num[], int length)
{
	for(int i = (length-2)/2; i >= 0; i--)//从最后一个非叶子节点开始
		build(num, i,  length);
}

//堆排序
void heapSort(int num[], int length)
{	
	buildHeap(num, length);	//构造堆
	while(length > 1)
	{
		swap(num[0], num[--length]);//根节点与最后一个叶子节点交换
		build(num, 0, length);//交换后可能不是堆了,故调整根节点
	}
}
int main()
{
	int num[LEN];
	clock_t start, end;
	double sortTime; 
	for(int i = 0; i < LEN; i++)
	{
       	    num[i] = rand();
        }
        start = clock();
	heapSort(num, LEN);
        //std::sort(num, num+LEN);//可以和STL的排序比较一下
	end = clock();
	sortTime = ((double)(end-start))/CLOCKS_PER_SEC;
	std::cout<<"time:"<< sortTime << std::endl;
	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值