堆排序

堆:完全二叉树
堆中i节点:
     左孩子:2xi+1
     右孩子:2×i+2
    父节点:(i-1)/2

import java.util.Arrays;
/*
堆排序:
将数组处理成一个大根堆;
将堆的顶部与最后一个与元素进行交换,并将边界heapsize左移一位
将交换后的堆,重新调成大根堆;
重复步骤一。
 */
public class heapSort {
    public static void main(String[] args) {
        int[]arr={1,4,100,38,56,23,2,1,0,89,12,66,2,54,6,87,8,9756,8};
        System.out.println(Arrays.toString(arr));
        heapInsert(arr);
        System.out.println(Arrays.toString(arr));
        heapSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    //堆排序
    public static void heapSort(int[] arr){
        int heapsize=arr.length-1;
        heapInsert(arr);
        for (int i = 0; i < arr.length; i++) {
            swap(arr,0,heapsize);
            heapsize--;
            heapfy(arr,0,heapsize);

        }
    }
    //数组转换为大根堆
    public static void heapInsert(int[]arr){
        for (int heapsize = 0; heapsize<arr.length ; heapsize++) {
            int index=heapsize;
            while(arr[index]>arr[(index-1)/2]){
                swap(arr,index,(index-1)/2);
                index=(index-1)/2;
            }
        }
    }
    //将大根堆的堆某个元素换一个数,大根堆的调整
    public static void heapfy(int[]arr,int index,int heapsize){
        int left=2*index+1;
    while (left<heapsize){
        int largerest=left+1<heapsize&&arr[left]<arr[left+1] ? left+1:left;
        largerest=arr[largerest]>arr[index]?largerest:index;
        if (largerest==index){
            break;
        }
        swap(arr,index,largerest);
        index=largerest;
        left=2*index+1;
    }
    }
    public static void swap(int[]arr,int a,int b){
        int tem=arr[a];
        arr[a]=arr[b];
        arr[b]=tem;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值