美文网首页
寻找第K小的元素

寻找第K小的元素

作者: moosoo | 来源:发表于2016-04-19 18:39 被阅读227次

点击链接解释的很棒~~~

//c++版
#include<iostream>
#include<algorithm>
#define Max 100
using namespace std;

int n,k;
int a[Max];
int find(int a[],int low,int high,int k){
        int p=high-low+1;
        if(p<6){                   /*如果要查找的数个数小于6个则直接排序*/ 
            ort(a+low,a+p);
            return a[k-1];
        }
        else{
            int q=p/5;             /*每五个元素分为一组*/
            int remainder = p - q * 5;
            int mid[100];
            for(int i=0;i<q;i++){     /*分别对每组进行排序,取中位数*/
                sort(a+5*i,a+5*(i+1));
                mid[i]=a[i*5+2];
            }
            if(remainder>0){         /*有剩余数则排序取中位数*/
                sort(a+5 * q, a+5 * q + remainder);
                mid[q] = a[q * 5 + (remainder + 1) / 2 - 1];
            }
            int mm=find(mid,0,q-1,(q+1)/2);   /*找中位数集合的中位数*/ 
            int a1[100],a2[100],a3[100];
            int lena1=0,lena2=0,lena3=0;
            /*与中位数集合的中位数进行比较,分成小于、等于、大于三组*/
            for(int i=low;i<=high;i++){    
                if(a[i]<mm)
                    a1[lena1++]=a[i];
                else if(a[i]==mm)
                    a2[lena2++]=a[i];
                else if(a[i]>mm)
                    a3[lena3++]=a[i];
            }
            int lastre = 0;
            /*比中位数集合的中位数小的数字个数大于k,则第k小元素在小于的数组里,仍
然找第k小的数*/
            if (lena1 >= k)         
                lastre = find(a1, 0, lena1 - 1, k);
             /*不大于中位数集合的中位数的数字个数小于k,则第k小元素在大于的数组里,
此时找第k - lena1- lena2小的元素*/
            else if (lena2 + lena1 < k)   
                lastre = find(a3, 0, lena3 - 1, k - lena1- lena2);
            /*第k小的元素等于中位数集合的中位数,则第k小元素在等于于的数组里*/
            else if (lena1 + lena2 >= k)   
                lastre = mm;
            return lastre;
        }
}

int main(){
        while(cin>>n>>k){           /*n为数组大小,k为要找的数的排序*/
            for(int i=0;i<n;i++){
                cin>>a[i];
            }
            if(k>n){
                cout<<"请重新输入¨,\n";
            }
            else{
                int result=find(a,0,n-1,k);
                cout<<"第"<<k<<"小的元素是: "<<result<<";"<<endl;
            }
        }
        return 0;
}

相关文章

  • 寻找第K小的元素

    点击链接解释的很棒~~~

  • 寻找第 k 小元素-分治法

    问题 对一个已经序列A[1,...,n],如何寻找其第k小的元素? 算法 使它在O(n)的时间复杂度内解决 code

  • 12 - Hard - Kth Smallest Elemen

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素...

  • 有序矩阵中第K小的元素

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素...

  • 快速排序和寻找第k小元素

    搞了一晚上寻找第k小元素,终于弄出来了,下面的代码,我测试的是没有问题的。这思想完美体现了快速排序的思想,分治,又...

  • 数据流中的第K大元素

    数据流中的第K大元素 设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。

  • Leetcode 703 数据流中的第K大元素

    数据流中的第K大元素 题目 设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个...

  • 基本算法——BFPRT线性查找算法

    BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPR...

  • 线性查找法(BFPRT)

    BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可...

  • 2018-07-03

    线性时间选择 给定线性序集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素,即如果将这n个...

网友评论

      本文标题:寻找第K小的元素

      本文链接:https://www.haomeiwen.com/subject/afkzlttx.html