最大堆排序最小堆排序

//堆是一种完全二叉树  就是每个节点都有两个子节点
public static   void maxHeapSort(int[] arrays,int node,int size){
        //获取左节点和右节点位置
        int left = node*2+1;
        int right = node * 2 +2 ;
        //假设node 是最大
        int max = node;
        //判断左节点有没有大于父节点
        if(left < size){//没有超出最大位置
            if(arrays[left] > arrays[max]){
                //记录max位置
                max = left;
            }
        }
        if(right < size){
            if(arrays[right] > arrays[max]){
                max =right;
            }
        }

        //如果max 大于根节点 就交换位置
       if(arrays[max] > arrays[node]){
           int temp = arrays[max];
           arrays[max]  = arrays[node];
           arrays[node] = temp;
           //继续建堆  交换位置之后可能该结点的子节点 没有达到要求 所有会递归调用 这里只是排序 每次取值取顶点 所以不需要递归调用了
          // maxHeapSort(arrays,max,size);
       }

}
public static void maxHeapify(int[] arrays, int size) {
    // 从数组的尾部开始,直到第一个元素(角标为0)
    for (int i = size - 1; i >= 0; i--) {
        maxHeapSort(arrays, i, size);
    }

}
public static void main(String[] args) {
    Random r = new Random();
    int [] a = new int[1_000_00];
    for(int i=0;i<a.length;i++){
        a[i] = r.nextInt(1_000_000);
    }
    long l = System.currentTimeMillis();
    for(int j = 0 ;j<a.length ;j++){//50005000
        maxHeapify(a, a.length - j);
        int temp = a[0];
        a[0] = a[(a.length - 1) - j];
        a[(a.length - 1) - j] = temp;
    }
    System.out.println("堆排序"+(System.currentTimeMillis() -l));
   
}

最小堆排序

public static void smallHeapSort(int[] array,int node,int size){
    int left = node *2 +1;
    int right = node *2 +2;

    int min = node;
    if(left < size){
        if(array[left] < array[node]){
            min = left;
        }

    }
    if(right < size){
        if(array[right] < array[min]){
            min = right;
        }
    }
    if(array[min] < array[node]){
        int temp = array[node];
        array[node] = array[min];
        array[min]  = temp;
        //smallHeapSort(array,min,size);
    }

}

//每一块都需要重新建堆
public static void rebuildHeap(int[] array,int size){
    for(int i=  size-1 ; i >=0 ; i--){
        smallHeapSort(array,i,size);
    }

}



public static void main(String[] args) {
    Random r = new Random();

    int[] a =new int[10];
    for(int i=0;i<10 ;i++){
        a[i] = r.nextInt(100);
    }
    System.out.println(Arrays.toString(a));
    //每次把堆首放在末尾即可降序
    for(int j = a.length ;j >=0 ;j--){
        rebuildHeap(a,j);
        //换位置
        if(j !=0){
            int t = a[0];
            a[0] = a[j-1];
            a[j-1] = t;
        }
    }
    System.out.println(Arrays.toString(a));
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值