博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

寻找第K大数

Posted on 2010-10-24 09:59  桃子在路上  阅读(1048)  评论(0)    收藏  举报

【试题描述】

N个小朋友在一起做游戏。
每个小朋友在自己的硬纸板上写一个数,然后同时举起来。
接着,小y老师提一个问题,看哪个小朋友先抢答出来。
问题是:在这N个数中,第K大的是哪个数?请你编程完成。

【输入描述】

输入文件的第一行为2个整数,依次为N和K( K <= N <= 10000 )。
下面N行,每行为一个整数,表示从第1个小朋友到第N个朋友分别写的数。假设这些小朋友只知道-32768~32767之间的数。

【输出描述】

输出文件只有一行,就一个数,为第K大的那个数。

【输入样例】


4 3
1
2
2
4

【输出样例】


2

【试题来源】
var
a:array[1..10000] of longint;
i,j,n,k,temp:longint;
begin
readln(n,k);
for i:=1 to n do
     readln(a[i]);
for i:=1 to n do
     for j:=i+1 to n do
         if a[j]>a[i] then begin temp:=a[j]; a[j]:=a[i]; a[i]:=temp; end;
writeln(a[k]);
end.

 

快速排序找第K大的数

 在n个不同元素中找出第K个最大元素。
  program search_k;
    var i,j,k:integer;
      a:array[1..100] of integer;
    procedure search(b,e:integer);
     var i,m,t:integer;
     begin
      if b=e then begin j:=b;exit end;
      i:=b;j:=e;m:=a[k];
      repeat
       while a[i]>m do inc(i);
       while m>a[j] do dec(j);   
       if i<j then begin t:=a[i];a[i]:=a[j];a[j]:=t; end;
      until i>=j;
      if i=k then exit;
      if i>k then search(b,j) else search(j+1,E);
      end;
    procedure print(n:integer);
     var i:integer;
     begin
      for i:=1 to n do write(a[i],' ');
      writeln;
      writeln('a[',k,']=',a[k]);
     end;
  begin
   write('n=');    readln(n);
   write('a[1..',n,']=');
   for k:=1 to n do read(a[k]);
   readln;
   write('k=');readln(k);
   search(1,n);
   print(n);
  end.