java实现堆排序的小心得

看着严老师的《数据结构》,对于当初使用c解决的算法,有点忘了,所以使用Java来实现一下堆排序。

堆排序的开始,是确定是要大顶堆还是小顶堆(这里确定使用小顶堆来做实现)

基本步骤

1:实现初始化堆,使得堆满足:父节点小于等于左右孩子。

1.1具体实现:从n/2开始,对于第n/2-第1个节点,都执行下沉操作

2:对于已经初始化堆,root就是最小值,将这个值与第N个值交换位置,并且弹出第n个值,现在的堆,root左右子树还是小顶堆,

     所以,只需把root下沉即可构造出新的小顶堆。

3:重复2步骤,直到弹出n个值。


代码实现

private static void heapSort(int[] nums) {
if (nums==null||nums.length==0) {
return;
}else {

//这是初始化堆
for (int i = nums.length/2; i>=0; --i) {
heapAdjust(nums,i,nums.length);
}

//最小堆实现算法
for (int i = nums.length-1,tem=0; i>0; i--) {
//保存小值在数组结尾
tem=nums[0];
nums[0]=nums[i];
nums[i]=tem;
heapAdjust(nums, 0, i);
}

}
}


private static void heapAdjust(int[] nums, int i, int length) {
// TODO Auto-generated method stub
int rc=nums[i];
for (int j = 2*i; j <= length-1; j*=2) {//查看当前节点和子节点的大小关系
if (j< length-1) {
if (nums[j]>nums[j+1]) {
j++;
}
}
if (rc<=nums[j]) {
break;
}
//交换下标(向下沉)和对应的值
nums[i]=nums[j];
i=j;
}
nums[i]=rc;//这个本来顶下沉到的位置为i
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值