java实现堆排序及其扩展题目

归并排序、快速排序以及堆排序的时间复杂度是O(N*logN)。但是归并排序的额外空间复杂度是O(N),快速排序是O(logN),堆排序是O(1)。
在这里插入图片描述

package class02P;

import java.util.Arrays;

public class Code03P_HeapSort {

    public static void heapSort(int[] arr){
        int size = arr.length - 1;
//        for (int i = 0; i < arr.length; i++) {//O(N)
//            heapInsert(arr, i);//O(logN)
//        }
        for (int i = arr.length - 1; i >= 0; i--) {
            heapify1(arr, i, arr.length - 1);
        }//O(N),这种堆化的时间复杂度更小
        System.out.println();
        for (int i = 0; i < arr.length - 1; i++) {
            swap(arr, 0, size--);
            heapify1(arr, 0, size);
        }
    }

    public static void heapify1(int[] arr, int index, int size){
        int left = index * 2 + 1;
        int maxIndex;
        while(left <= size){
            maxIndex = left + 1 <= size && arr[left + 1] > arr[left] ? left + 1 : left;
            if(arr[maxIndex] > arr[index]){
                swap(arr, index, maxIndex);
                index = maxIndex;
                left = index * 2 + 1;
            }else{
                break;
            }
        }
    }

    public static void heapInsert(int[] arr, int index){
        while(arr[(index - 1) / 2] < arr[index]){
            swap(arr, index, (index - 1) / 2);
            index = (index - 1) / 2;
        }
    }

    public static void swap(int[] arr, int i, int j){
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

    public static void main(String[] args) {
        int[] arr = {28, 13, -61, -42, 1, -73, 84};
        System.out.println(Arrays.toString(arr));
        heapSort(arr);
        System.out.println(Arrays.toString(arr));

    }

}


在这里插入图片描述

package class02P;

import java.util.Arrays;
import java.util.PriorityQueue;

public class Code04P_SortArrayDistanceLessK {
    public static void sortArrayDistanceLessK(int[] arr, int k){
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        int index = 0;
        for (; index < Math.min(arr.length, k); index++) {
            heap.add(arr[index]);
        }
        int i = 0;
        for(;index < arr.length; index++, i++){
            arr[i] = heap.poll();
            heap.add(arr[index]);
        }
        while(!heap.isEmpty()){
            arr[i++] = heap.poll();
        }
    }

    public static void main(String[] args) {
        int[] arr ={2, 3, 1, 6, 5, 4};
        System.out.println(Arrays.toString(arr));
        sortArrayDistanceLessK(arr, 3);
        System.out.println(Arrays.toString(arr));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值