noip2008C_4_2(找第k大的数)给定一个长度为1,000,000的无序正整数序列,以及另一个数n(1≤n≤1000000),然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3大的数是4)
var
a:array[1..1000000]of integer;
n,m,ans:longint;
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:=a[left];
i:=left;
j:=right;
while i<j do
begin
while (i<j) and (a[j]<value) do dec(j);
if i<j then
begin
a[i]:=a[j];
inc(i);
end
else break;
while (i<j) and (a[i]>value) do inc(i);
if i<j then
begin
a[j]:=a[i];
dec(j);
end
else break;
end;
a[i]:=value;
if i<n then
begin
inc(i);
exit(FindKth(i,right,n));
end;
if i>n then
begin
dec(i);
exit(FindKth(left,i,n));
end;
exit(i);
end;
var
i:integer;
begin
randomize;
assign(input,'in.txt');
reset(input);
readln(m,n);
for i:=1 to m do read(a[i]);
ans:=FindKth(1,m,n);
writeln(a[ans]);
end.