[NOIP算法]快速排序——双关键字

关于快排的双关键字排序。

要求: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;

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值