堆排序算法的实现(HeapSort)

堆排序的时间复杂度是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;
	
} 



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值