关于快排的双关键字排序。
要求:a[i]按照从小到大排序,a[i]相同则按b[i]从小到大排序。
核心:先比较a[i],按正常排序;或则a[i]相同,则b[i]按照顺序也可通过。
代码:
program qsort_double;
var n,i:longint;
a,b:array[1..10000]of longint;
procedure qsort(x,y:longint);
var i,j,mid1,mid2,t:longint;
begin
i:=x;j:=y;
mid1:=a[(x+y) div 2];
mid2:=b[(x+y) div 2];
repeat
while (a[i]<mid1)or(a[i]=mid1)and(b[i]<mid2) do i:=i+1;
while (a[j]>mid1)or(a[j]=mid1)and(b[j]>mid2) do j:=j-1;
if i<=j then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
t:=b[i];b[i]:=b[j];b[j]:=t;
i:=i+1;j:=j-1;
end;
until i>j;
if i<y then qsort(i,y);
if x<j then qsort(x,j);
end;
begin
read(n);
for i:=1 to n do
read(a[i],b[i]);
qsort(1,n);
for i:=1 to n do
writeln(a[i],' ',b[i]);
end.
扩展:若为三关键字,则改成
while (a[i]<mid1)or(a[i]=mid1)and(b[i]<mid2)or(a[i]=mid1)and(b[i]=mid2)and(c[i]<mid3) do i:=i+1;
while (a[j]>mid1)or(a[j]=mid1)and(b[j]>mid2)or(a[j]=mid1)and(b[j]=mid2)and(c[j]>mid3) do j:=j-1;