java堆排序算法及代码

堆排序总结及代码
这里写图片描述
这里写图片描述
这里写图片描述

public class DuiPaixu {

    static  final int SIZE = 10;

    static void heapSort(int a[],int n){   //堆排序 
        int i,j,h,k;
        int t;

        for(i = n/2-1;i>=0;i++){//将啊a[0,n-1]  建成大根堆
            while(2*i+1<n){ //第i个节点  右子树
                j=2*i+1;
                if((j+1)<n){
                    if(a[j]<a[j+1])  //右左子树小于右子树,则需要比较右子树
                        j++;   //序号增加1,指向右子树
                }
                if(a[i]<a[j]){   //比较i与j为序号的数据
                    t = a[i];    //交换数据
                    a[i] = a[j];
                    a[j] = t;
                    i = j;   //堆被破坏,需要重新调整
                }
                else{        //比较左右子节点结构均大则堆未破坏,不再需要调整
                    break;
                }
            }
        }

        //输出构成的堆
        System.out.println("元数据构成的堆");

        for(h =0;h<n;h++){
            System.out.println("" + a[h]);
        }

        System.out.println("\n");

        for(i = n -1;i>-0;i--){
            t = a[0];   //与第i个记录交换
            a[0] = a[i];
            a[i] = t;
            k = 0;
            while(2*k+1<i){ //第i个节点有右子树
                j = 2*k +1;
                if((j+1)<i)
                {
                    if(a[j]<a[j+1])  //右左子树小于右子树,则需要比较右子树
                    {
                        j++;   //序号加一,指向右子树
                    }
                }


                if(a[k] <a[j]){  //比较i与j为序号的数据
                    t = a[k];  //交换数据
                    a[k] =a[j];
                    a[j] = t;
                    k = j;    //堆被破坏需要被重新调整
                }
                else{   // 比较左右子节点均大则堆未破坏,不再需要调整
                    break;
                }
            }
        }
        System.out.println("第"+(n - i)+"步排序结果");
        for(h = 0;h<n;h++){
            System.out.println("  "+a[h]);   //输出
        }
        System.out.println("\n");
    }


    public static void main(String[] args) {
        int[] shuzu = new int[SIZE];
        int i;

        for(i = 0;i<SIZE;i++){
            shuzu[i] =(int) (100+Math.random()*(100+1));
        }

        System.out.println("排序前的数组为:\n");
        for(i = 0;i<SIZE;i++){
            System.out.println(shuzu[i]+" ");
        }
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值