2020-03-02:在无序数组中,如何求第K小的数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020-03-02:在无序数组中,如何求第K小的数?相关的知识,希望对你有一定的参考价值。

2020-03-02:在无序数组中,如何求第K小的数?

参考技术A 具体问题具体分析。
几种情况及思路。
1、如果数组规模不大。可以先排序,然后顺序求出第K小的单元。
2、如果规模大,但需要找多个第K。也建议用上面算法。
3、如果规模非常大。排序效率不高。建议使用最小值定位函数,大多数语言都有的,且效率远高于排序。定位后将最小值单元交换到数组头部,重复过程,直到找到第K单元。

快排划分思想的应用-求第k大数或者第k小的数(求前k大数或者前k小的数)

//第k大数,第k小的数--前k大数,k小的数-----------------------------------------------------------------------
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
//每次选择第一个元素作为划分点,比它小放左边,比它大放右边
int partitionV2(int *a,int low,int high)

    int key=a[low];
    int i=low,j=high;
    while(i<j)
    
        while(i<j&&a[j]>=key)j--;
        a[i]=a[j];
        while(i<j&&a[i]<=key)i++;
        a[j]=a[i];
    
    a[i]=key;
    return i;

//寻找第k大数
int find_K_max(int *a,int n,int k)

/*
8 3
1 5 3 4 2 6 8 7
11 6
78934 234 65 32 543 354 567 3412 3 547 423
11 5
11 6 78934 234 65 32 543 354 567 3412 3
*/
    int low=0,high=n-1;
    while(low<=high)
    
        int index=partitionV2(a,low,high);
        if(index==n-k)
        
            return a[index];
        
        else if(index<n-k)
        
            low=index+1;
        
        else
        
            high=index-1;
        
    

//寻找第k小数
int find_K_min(int *a,int n,int k)

/*
8 3
1 5 3 4 2 6 8 7
11 6
78934 234 65 32 543 354 567 3412 3 547 423
11 5
11 6 78934 234 65 32 543 354 567 3412 3
*/
    int low=0,high=n-1;
    while(low<=high)
    
        int index=partitionV2(a,low,high);
        if(index==k-1)
        
            return a[index];
        
        else if(index<k-1)
        
            low=index+1;
        
        else
        
            high=index-1;
        
    

int main()

    int n,k;
    int a[100];
    while(cin>>n>>k)
    

        vector<int> mv(n);
        for(int i=0;i<n;++i)
        
            cin>>a[i];
            mv[i]=a[i];
        
        cout<<find_K_min(a,n,k)<<endl;
        sort(mv.begin(),mv.end());
        cout<<mv[k-1]<<endl;
    
    return 0;


以上是关于2020-03-02:在无序数组中,如何求第K小的数?的主要内容,如果未能解决你的问题,请参考以下文章

【python滴滴出行】整数无序数组求第K大数?

经典面试题无序数组中,求第K大的数(堆荷兰国旗问题bfprt算法)

经典面试题无序数组中,求第K大的数(堆荷兰国旗问题bfprt算法)

经典面试题无序数组中,求第K大的数(堆荷兰国旗问题bfprt算法)

如何查找无序数组中的Top n

*HDU2852 树状数组(求第K小的数)