首页 > 试题广场 >

(找第k大的数)给定一个长度为1,000,000的无序正整数

[填空题]
(找第k大的数)给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1≤n≤1000000),然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3大的数是4。)
program t2;
var
  a:array[1..1000000] of integer;
  n,m,ans:integer;
procedure swap(var a,b:integer);
var t:integer;
begin
  if (a<>b) then
  begin
    t:=a; a:=b; b:=t;
  end;
end;
function FindKth(left,right,n:integer):integer;
var
  tmp,value,i,j:integer;
begin
  if left=right then exit(left);
  tmp:=random(right-left)+left;
  swap(a[tmp],a[left]);
  value:=     1    ;
  i:=left; j:=right;
  while i<j do
    begin
        while (i<j) and (    2    ) do dec(j);
        if i<j then
        begin
            a[i]:=a[j]; inc(i);
        end
        else break;
        while (i<j) and (     3     ) do inc(i);
        if i<j then
        begin
              a[j]:=a[i]; dec(j);
        end
        else break;
    end;
    4
    if i<n then begin inc(i); exit( FindKth(    5     ) ); end;
    if i>n then begin dec(i); exit(      6     ); end;
    exit(i);
end;
var i:integer;
begin
  randomize;
  m:=1000000;
  for i:=1 to m do read(a[i]));
  read(n);
  ans:=FindKth(1,m,n);
  writeln(a[ans]);
end.

这道题你会答吗?花几分钟告诉大家答案吧!