zoukankan      html  css  js  c++  java
  • 一个在时间复杂度为O(n)情况下找第k大的数的算法

    利用快速排序,在进行完一次快排之后,让k和分成的两个子数组比较,比如说a[p……r] 被分成了 a[p……q]和 a[q+1……r] 让这个K和左边的子数组中元素的个数比较,如果大于,则递归左区间
    如果小于,则递归右区间。这样,在期望意义下,程序的时间复制度为O(n)

     1 #include<stdio.h>
    2 #include<iostream>
    3 #include<string.h>
    4 using namespace std;
    5 #define N 10000
    6 int a[N];
    7 void sortt(int l,int r,int k)
    8 {
    9 int ll = l,rr = r;
    10 int key = a[l];
    11 if(ll >= rr) return ;
    12 while(ll < rr)
    13 {
    14 while(ll < rr && a[rr] >= key) rr--;
    15 a[ll]=a[rr];
    16 while(ll < rr && a[ll] <= key) ll++;
    17 a[rr]=a[ll];
    18 }
    19 a[ll] = key;
    20 if(k > ll - l + 1) sortt(ll + 1, r, k);
    21 else sortt(l, ll, k);
    22 }
    23 int main()
    24 {
    25 int i;
    26 int n,k;
    27 while(cin>>n,n)
    28 {
    29 for(i=0;i<n;i++)
    30 cin>>a[i];
    31 cin>>k;
    32 sortt(0,n-1,k);
    33 cout<<a[k-1]<<endl;
    34 }
    35 return 0;
    36 }
  • 相关阅读:
    12_常用类
    MyBatis_02 框架
    MyBatis_01 框架
    正则表达式
    11_异常处理
    产品经理成长之路(非原创)
    【Java每日一题】20161115
    【Java每日一题】20161114
    【Java每日一题】20161111
    【Java每日一题】20161110
  • 原文地址:https://www.cnblogs.com/fxh19911107/p/2392471.html
Copyright © 2011-2022 走看看