堆排序

public class HeapSort {

    public static void main(String []args){

        int [] arr = {20,50,20,40,70,10,80,30,60};

        heapSort(arr);

        System.out.println(Arrays.toString(arr));

    }

    private static void heapSort(int[] arr) {

        if (arr == null || arr.length<2){

            return;

        }

        //构建大顶堆

        for (int i = arr.length>>1; i >=0; i--) {

            adjustHead(arr,i,arr.length);

        }

        //交换顶部文件并调整堆结构

        for (int j = arr.length-1; j >0 ; j--) {

            adjustHead(arr,0,j);

            swap(arr,0,j);

        }

    }

    private static void swap(int[] arr, int i, int j) {

        int temp = arr[i];

        arr[i] = arr[j];

        arr[j] = temp;

    }

    private static void adjustHead(int[] arr, int i, int length) {

        int temp = arr[i];

        for (int j = i*2+1; j < length; j=j*2+1) {

            if (j+1<length && arr[j]<arr[j+1]){

                j++;

            }

            if (arr[j]>temp){

                arr[i] = arr[j];

                i = j;

            } else {

                break;

            }

        }

        arr[i] = temp;

    }

//    private static void heapSort(int[] arr) {

//

//        //构建大顶堆

//        for (int i = arr.length/2; i >=0; i--) {

//            adjustHeap(arr,i,arr.length);

//        }

//        //交换堆顶元素与末尾元素,调整堆结构

//        for (int j = arr.length-1; j >0 ; j--) {

//            swap(arr, 0,j);

//            adjustHeap(arr,0,j);

//        }

//    }

//

//    private static void swap(int[] arr, int i, int j) {

//        int temp = arr[i];

//        arr[i]= arr[j];

//        arr[j]=temp;

//    }

//

//    private static void adjustHeap(int[] arr, int i, int length) {

////        int temp = arr[i];

////        for (int k = i*2+1; k < length; k = k*2+1) {

////            if (k+1<length && arr[k]<arr[k+1]){

////                k++;

////            }

////            if (arr[k]>temp){

////                arr[i]= arr[k];

////                i = k;

////            } else {

////                break;

////            }

////        }

////        arr[i] = temp;

//

//        int temp = arr[i];

//        for (int j = i*2+1; j < length; j=j*2+1) {

//            if (j+1<length && arr[j]<arr[j+1]){

//                j++;

//            }

//            if (arr[j]>temp){

//                arr[i] = arr[j];

//                i = j;

//            } else {

//                break;

//            }

//        }

//        arr[i]= temp;

//    }

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • public class HeapSort { public static void main(String ...
    海是倒过来的天_67f2阅读 162评论 0 0
  • 堆是一棵满足一定性质的二叉树,具体的讲堆具有如下性质:父节点的键值总是不大于它的孩子节点的键值(小顶堆), 堆可以...
    9527Roy阅读 796评论 0 0
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 2,126评论 0 2
  • package basic_class_01; import java.util.Arrays; ``` * 左神...
    枫叶忆阅读 594评论 0 1
  • 还自贵阳,寓德阳之地,凡数日也,虽有伤患之忧,亦有随心之乐! 向出于庭,会于市!有卖鱼者!观盆中,...
    御郎阅读 315评论 0 1

友情链接更多精彩内容