写一下堆排序

写一下堆排序,第1张

写一下堆排序
 public static void main(String[] args) {
        int[] arr={7,6,4,3,5,2,10,9,8};
        System.out.println(Arrays.toString(arr));
        heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    
    public static  void heapSort(int[] arr){
        //首先,对数组先进行初始堆化,我们从最后一个非叶子节点开始堆化
        for(int i=data.length/2-1;i>=0;i--){
            createHeap(data,i,data.length);
        }
        //此时已经构造出一个堆树,堆顶的元素就是整个数组中最大的元素
        //我们通过将堆顶元素和尾节点交换,实现最大的元素放数组的最后
        //再对除去最后元素的数组针对堆顶的节点进行堆化,再求出最大的再放当前堆树的后面,
        //以此类推,每次都将当前堆树最大的值往后放,最后就可以得到从小到大的数组了
        for(int i=data.length-1;i>0;i--){
            int temp =  data[i];
            data[i] = data[0];
            data[0] = temp;
            createHeap(data,0,i);
        }
    }

    
    private static void createHeap(int[] data, int i, int length) {
            int temp = data[i];
            int parent = i;
            int child = 2*i +1;
            while(childdata[child]){
                    child++;
                }
                //和一开始要进行堆化的节点的值进行对比,如果该值大于左右节点的最大值了,那么 跳出循环,将值赋予当前节点
                if(temp > data[child]){
                    break;
                }
                //将左右节点的最大值赋予当前节点
                data[parent] = data[child];
                //让父节点指针指向最大的那个子节点
                parent = child;
                //拿到父节点的子节点
                child = 2*parent+1;
            }
            //跳出循环,证明已经拿到了一开始要堆化的节点的值已经到了大于左右节点的节点的位置
            data[parent] = temp;
    }

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5673000.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存