堆排序

求最小的K个数

 

public int[] getLeastNumbers(int[] arr, int k) {
        if(arr.length == 0 || k == 0){
            return new int[0];
        }
        //构建小顶堆
        buildHeap(arr);
        //弹出堆顶 重排序
        int[] rsp = new int[k];
        for(int i = 0; i<k;i++){
            rsp[i] = arr[0];
            swap(arr,0,arr.length-1-i);
            
            execute(arr, 0,arr.length-2-i);
        }
        return rsp;
        
    }

    private void buildHeap(int[] arr){
        for(int i = arr.length/2-1; i>=0;i--){
            execute(arr, i ,arr.length-1);
        }
    }

    private void execute(int[] arr, int head, int right1){
        int left = 2*head +1;
        int right = left +1;
        int min = head;
        if(left <= right1 && arr[left]<arr[min]){
            min = left;
        }
        if(right <= right1 && arr[right]<arr[min]){
            min = right;
        }
        if(min !=  head){
            swap(arr,head,min);
            execute(arr, min ,right1);
        }

    }
    private void swap(int[] arr, int head, int min){
        int a = arr[head];
        arr[head] = arr[min];
        arr[min] = a;
    }
  

  

 

posted @ 2023-07-02 19:16  CodingOneTheWay  阅读(8)  评论(0编辑  收藏  举报
回到顶部