您的位置:首页 > 编程语言 > C语言/C++

堆排序算法的实现(HeapSort)

2017-09-29 17:32 405 查看
堆排序的时间复杂度是O(nlgn),是原址排序。

这个堆排序主要写了三个函数:

Max_heapify:这个是整堆函数,是将i节点整成符合大顶堆的规则,即父节点大于左右孩子节点。我写的这个函数可能和书上的不太一样,有3个参数,由于我用的是静态数组写的,在后面heap_sort函数中会逐渐减小数组元素个数,实际上不是减少,而是因为最后面有排好序的元素了,我们调用整堆函数不能将排好序的元素再整一下堆,这样会回到建成的最大堆的状态,也不谈排序了。(补充一下:这个堆排序是基于大顶堆的规则来描述的)

build_max_heap:将数组建成最大堆,值得一提的是建堆的时候是从最后一个非叶子节点往上整堆,一直到根。而不是自顶向下整堆,这个可以思考一下,或者举个例子看一下为什么不行。

heap_sort:堆排序喽!

我这个是基于静态数组的堆排序,废话不多说,直接上代码。

#include<iostream>
#include<math.h>
using namespace std;
#define length 5

int parent (int i)
{//求i节点的父节点的下标
return floor(i/2);
}
int left(int i){//求i节点的左孩子的下标
return 2*i;
}
int right(int i){//求i节点右孩子的下标
return 2*i+1;
}
void Max_heapify(int a[],int i,int heapsize){//将i节点调整符合大顶堆规则
int l=left(i);
int r=right(i);
int largest;
if(l<=heapsize&&a[l]>a[i]){
largest=l;
}
else
{
largest=i;
}

if(r<=heapsize&&a[r]>a[largest]){
largest=r;
}
if(largest!=i){
int temp;
temp=a[i];
a[i]=a[largest];
a[largest]=temp;
Max_heapify(a,largest,heapsize);
}
}
void build_max_heap(int a[]){//将数组建成大顶堆
int k;
k=length/2;
int i;
for(i=k;i>=1;i--){
Max_heapify(a,i,length);
}
}
void heap_sort(int a[]){//基于大顶堆的堆排序
build_max_heap(a);
int j;
cout<<"--------------"<<endl;
for(j=1;j<=length;j++)
cout<<a[j]<<endl;
cout<<"--------------"<<endl;
int i;
int heapsize=length;
for(i=length;i>=2;i--){
int temp=a[1];
a[1]=a[i];
a[i]=temp;
heapsize-=1;
Max_heapify(a,1,heapsize);
}
}
int main(){
int a[length+1];
a[0]=0;
int j;
for(j=1;j<=length;j++){
cin>>a[j];
}
heap_sort(a);
for(j=1;j<=length;j++)
cout<<a[j]<<endl;
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息