/*
堆用数组实现,起始下标为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");
}
堆排序的实现
最新推荐文章于 2024-07-14 22:24:20 发布