求一个数组的第k大数

思路;

利用一个长度为k的数组,

遍历要查询的数组,如果辅助数组的长度小于k ,则直接添加到辅助数组

否则则跳过

c++实现如下

void findkmax(int* arr,int len,int k){
    if(arr == NULL || len < k || len <= 0 ){
        return;
    }
    multiset<int> set;


    for (int j = 0; j < len; ++j) {
        if(set.size() < k){
            set.insert(arr[j]);
        } else{
            multiset<int,greater<int>>::iterator it = set.begin();
            int first = *it;
            if(first < arr[j]){
                set.erase(it);
                set.insert(arr[j]);
            }
        }
    }

    for (multiset<int,greater<int>>::iterator it = set.begin(); it != set.end() ; ++it) {
        cout<<*it<<" ";
    }

    cout<<endl;


}

 java 版

public class Client {
    public static void main(String[] args) {
        int[] arr={6,1,3,4,4,0,87,45,3,90,90,90};
        findKMax(arr,4);
    }
    private static void findKMax(int[] arr, int k) {
        if(arr == null || arr.length < k){
            return;
        }
        int[] resultArr = new int[k];
        int resultIndex = 0;
        boolean isSort = false;
        for (int i : arr) {
            if(resultIndex < k){
                resultArr[resultIndex] = i;
                resultIndex++;
            }else {
                if(!isSort){
                    mergeSort(resultArr,0,resultArr.length - 1);
                    isSort = true;
                }
                int first = resultArr[0];
                if(first < i){
                    resultArr[0] = i;
                    sortArr(resultArr);
                }
            }
        }

        for (int i : resultArr) {
            System.out.println(i);
        }
    }

    private static void sortArr(int[] arr){
        for (int i = 1; i < arr.length; i++) {
            if(arr[0] <= arr[i]){// 这个位置上的数比第一个大,就把第一个数跟i-1 位置上的数进行交换
                if(arr[0] == arr[i-1]){
                    return;
                }
                int temp = arr[0];
                for (int j = 0; j < i - 1; j++) {
                    arr[j] = arr[j + 1];
                }
                arr[i-1] = temp;
                return;
            }
            if(i == arr.length - 1){
                int temp = arr[0];
                for (int j = 0; j < arr.length - 1; j++) {
                    arr[j] = arr[j + 1];
                }
                arr[i] = temp;
            }

        }
    }

    private static void mergeSort(int[] arr,int start,int end){
        if(start >= end){
            return;
        }
        int mid = (start + end) >> 1;
        mergeSort(arr,start,mid);
        mergeSort(arr,mid + 1, end);
        merge(arr,start,mid,end);
    }


    private static void merge(int[] arr, int start, int mid, int end) {
        int[] temp = new int[end - start + 1];
        int left = start;
        int right = mid + 1;
        int index = 0;
        while (left <= mid && right <= end){
            if(arr[left] < arr[right]){
                temp[index] = arr[left];
                left++;
            }else {
                temp[index] = arr[right];
                right++;
            }
            index++;
        }
        while (left <= mid){
            temp[index] = arr[left];
            left++;
            index++;
        }
        while (right <= end){
            temp[index] = arr[right];
            right++;
            index++;
        }
        for (int i = 0; i < temp.length; i++) {
            arr[start + i] = temp[i];
        }
    }
}
原文地址:https://www.cnblogs.com/dongma/p/13924100.html