您的位置:首页 > 其它

noip2008初赛-找第K大的数

2015-08-23 17:19 246 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: