您的位置:首页 > 理论基础 > 数据结构算法

堆排序的实现

2013-09-04 20:33 274 查看
/*
堆用数组实现,起始下标为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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息