堆排序(heapsort)

1.在原数组的基础上改造成二叉堆,先从最下面一个父节点开始检查,使父节点总是大于他的两个子节点,根上为最大的数

2.根不断出堆,并放到最后把堆首(最大值)和堆尾互换,把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置,重复步骤,直到堆的尺寸为1

void PercDown(int a[],int i,int n){
	int child,tmp;
	for(tmp = a[i];2*i +1<n;i  = child){
		child = 2*i + 1;  //becasue a[0] is root,so i's left child is 2*i + 1, right child is 2*i + 2
		if(child!=n-1&&a[child]<a[child+1])
			child++;
		if(tmp<a[child])
			a[i] = a[child];
		else break;
	}
	a[i] = tmp;
}

void Heapsort(int a[],int n){
	int i;
	for(i = n/2;i>=0;i--)
		PercDown(a,i,n);
	for(i = n-1;i>=0;i--){
		swamp(&a[0],&a[i]);
		PercDown(a,0,i);
	}
}

void swamp(int *a,int *b){
	int tmp;
	tmp = *a;
	*a = *b;
	*b = tmp;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值