快速排序求第K小

嗯。。就是在快排的時候不去管另外一邊

然後沒什麼了。。

用的是算法導論上的代碼。。

var	a:Array[0..10000000] of longint;
	step,n,i,j,k:longint;
procedure swap(var a,b:longint);
begin
	step:=a;
	a:=b;
	b:=step;
end;
function partition(left,right:longint):longint;
var i,x,j:longint;
begin
	swap(a[(left+right) shr 1],a[right]);
	x:=a[right];
	i:=left-1;
	for j:=left to right-1 do
	begin
		if a[j]<x then begin
						inc(i);
						swap(a[i],a[j]);
					   end;
	end;
	swap(a[i+1],a[right]);
	exit(i+1);
end;
function FindKth(left,right:longint):longint;
var i,j:longint;
begin
	if (left=right) then exit(a[left]);
	i:=partition(left,right);
	if (k=i) then exit(a[i])
			 else if (i>k) then exit(FindKth(left,i-1))
						   else exit(FindKth(i+1,right));
end;
begin
	readln(n,k);
	for i:=1 to n do readln(a[i]);
	writeln(FindKth(1,n));
end.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章