关于几种特殊排序的自我理解(堆排序篇)

堆排序的源代码如下
/**
 * Created by ql on 2018/3/2.
 */
public class heap {
    public static void heapSort(int []arr){
        if(arr==null||arr.length<2){
            return;
        }
        for (int i=0;i<arr.length;i++)
        {//将数字插入堆中
            heapInsert(arr,i);
        }

        int size=arr.length;
        //因为已经构建好了大顶堆,所以最顶端的值是整个堆中最大的值,根据堆排序的原理,可以得知需要将堆顶元素与数组内下标最大的元素交换一次位置。
        swap(arr,0,--size);
        while(size>0){
            heapify(arr,0,size);
            swap(arr,0,--size);
        }
    }

    private static void heapify(int[] arr, int index, int size) {
        //调整堆,使其构成大顶堆。
        int left=index*2+1;//index的左子树,left+1代表index的右子树
        while(left<size) {
            int large = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left;//将较大的值得下标赋值给large
            large = arr[large] > arr[index] ? large : index;//将左右子树中的较大值与index位置的值比较,获取较大值得下标
            if (large == index){//若当前值代表整个堆中的最大值,则堆排序实现完毕
                break;
            }
            swap(arr,large,index);
            index=large;//准备遍历子树,继续向下进行堆排序。
            left=index*2+1;
        }
    }
    private static void swap(int[] arr, int index1, int index2) {
        //交换两个数的过程。
//       arr[index1]=arr[index1]^arr[index2];
//       arr[index2]=arr[index1]^arr[index2];
//       arr[index1]=arr[index1]^arr[index2];
        int temp=arr[index1];
        arr[index1]=arr[index2];
        arr[index2]=temp;
    }
    private static void heapInsert(int[] arr, int index) {
        //这里是构造大顶堆的过程。若需要修改为小顶堆,则需要将while内的判断条件修改一下即可。
        //得到的结果是根节点的值要大于其左右子树的值。
        while(arr[index]>arr[(index-1)/2]){
            swap(arr,index,(index-1)/2);
            index=(index-1)/2;
        }
    }
    public static void main(String args[])
    {
        int[]newarr=new int[]{1,2,10,3,5,7,9};
        heapSort(newarr);
        for (int i=0;i<newarr.length;i++) {
            System.out.print(newarr[i]+" ");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值