不能用排序、求一个数组第k大的数字、时间复杂度为O(nlog₂k)

思想:
既然不能用排序还要求数组第k大的数字,时间复杂度为O(nlog₂k),那么我们可以用快速排序的思想,因为快速排序每次都会确定待排序数组的一个基准在数组中合适的位置,那么只要我们得到一个基准的排序后位置下标等于k-1,那么这个位置的数字就是我们要找的这个数字;

public class TestDemo6 {
    public static void main(String[] args) {
        int[] array = {3,1,2,5,4,7,6};
        find(array,0,array.length-1,5);
    }

    /**
     * 找一个数组第k大的数字
     * @param array
     * @param start
     * @param end
     * @param k
     */
    public static void find(int[] array,int start,int end,int k) {
        int par = partion(array,start,end);
        if(par == k-1) {
            System.out.println("数组中第"+k+"大的数字是:"+array[par]);
            return;
        }else if(par > k-1) { //左边找
            find(array,start,par-1,k);
        }else {
            find(array,par+1,end,k);
        }
    }


    /**
     * 一次快排(从大到小排的)
     * @param array
     * @param low
     * @param high
     * @return
     */
    public static int partion(int[] array,int low,int high) {
        int temp = array[low];
        while(low < high) {
            while (low < high && array[high] <= temp) {
                --high;
            }
            array[low] = array[high];

            while (low < high && array[low] >= temp) {
                ++low;
            }
            array[high] = array[low];
        }
        array[high] = temp;
        return high;
    }
}

运行结果:

数组中第5大的数字是:3

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/86484518
今日推荐