从数组中找出第K大的数

Posted andywu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从数组中找出第K大的数相关的知识,希望对你有一定的参考价值。

 

利用改进的快排方法

public class QucikFindMaxK {
    static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

//   升序排列,比arr[pivotIndex]值小的数都在arr[pivotIndex]左边,大的数都在右边
    static int partition(int arr[], int left, int right, int pivotIndex) {
        int storeIndex = left;  //storeIndex表示左边排好序的最后一个位置
        int pivotValue = arr[pivotIndex];
        swap(arr, pivotIndex, right); //先把pivoit位置的值放到最右边right
        for (int i = left; i < right; i++) {
            if (arr[i] > pivotValue) {
                swap(arr, i, storeIndex);
                storeIndex++;
            }
        }
        swap(arr, storeIndex, right); //将最右边的pivotValue交换到storeIndex后面,此时整个数组满足storeIndex左边的值大,右边的值小
        return storeIndex;
    }

    static int findKMax(int arr[], int left, int right, int k) {
        int pivotIndex = left + 1;
        int nRet = partition(arr, left, right, pivotIndex);
        if (nRet < k) return findKMax(arr, nRet + 1, right, k);//第K大值在pivot的右边,所以从pivot后面查找
        else if (nRet > k) return findKMax(arr, left, nRet - 1, k);//第K大值在pivot的左边,所以从pivot前面查找
        return nRet;
    }

    public static void main(String[] args) {
        int arr[] = {8, 3, 4, 1, 9, 7, 6, 10, 2, 5};
        int nRet = findKMax(arr, 0, 9, 1);//MaxValued对应的的k为0
        System.out.println(" Max Number is" + arr[nRet]);

    }
}

 

以上是关于从数组中找出第K大的数的主要内容,如果未能解决你的问题,请参考以下文章

Matlab/simulink:一个数组 不用排序的方法 找出它当中第K大的数

查找无序数组中第K大的数

您好,请用Matlab/simulink编写个程序:一个数组 不用排序的方法 找出它当中第K大的数

无序数组中第Kth大的数

找出数组中第k大的数(时间复杂度分析C++代码实现). TopK in array. ( leetcode - 215 )

找出数组中第k大的数(时间复杂度分析C++代码实现). TopK in array. ( leetcode - 215 )