• 求一个数组的第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];
            }
        }
    }
  • 相关阅读:
    观察OnPaint与OnIdle与OnSize事件
    wxPython的Refresh与事件双重响应
    DLL的静态调用和动态调用
    Delphi String的散漫记录,真是知识无数,陷阱无数
    VC调用Delphi DLL
    终于理解了什么是LGPL
    安装postgresql碰到Unable to write inside TEMP environment path
    图解:Activity生命周期
    Dephi泛型
    传递双重指针申请内存,典型用法
  • 原文地址:https://www.cnblogs.com/dongma/p/13924100.html
Copyright © 2020-2023  润新知