回 帖 发 新 帖 刷新版面

主题:关于快排,急!!!

这是TP自带的快排,是从小到大排序的,谁能帮我改成从大到小排的?

const maxn=10000;
type arr:array[1..maxn] of longint;
var a:arr;
    i,n:longint;

procedure qsort(var a:arr;lo,hi:longint);

procedure sort(l,r:longint);
var i,j,x,y:longint;
begin
     i:=l;j:=r;x:=a[(l+r) div 2];
     repeat
           while a[i]<x do i:=i+1;
           while x<a[j] do j:=j-1;
           if i<=j
              then
                   begin
                        y:=a[i];a[i]:=a[j];a[j]:=y;
                        i:=i+1;j:=j-1;
                   end;
     until i>j;
     if l<j then sort(l,j);
     if i<r then sort(i,r);
end;

begin
     sort(lo,hi);
end;

begin
     readln(n);
     for i:=1 to n do
         readln(a[i]);
     qsort(a,1,n);
end.

回复列表 (共3个回复)

沙发

procedure sort(l,r:longint);
var i,j,x,y:longint;
begin
     i:=l;j:=r;x:=a[(l+r) div 2];
     repeat
           while a[i]>x do i:=i+1;
           while x>a[j] do j:=j-1;
           if i<=j
              then
                   begin
                        y:=a[i];a[i]:=a[j];a[j]:=y;
                        i:=i+1;j:=j-1;
                   end;
     until i>j;
     if l<j then sort(l,j);
     if i<r then sort(i,r);
end;

板凳

program px;
var a:array[1..100] of integer;
    i:integer;
procedure px(left,right:integer);
var l,r,temp,min:integer;
begin
  l:=left; r:=right;min:=a[(l+r) div 2];
  repeat
  while (a[l]>min) do l:=l+1;
  while (a[r]<min) do r:=r-1;
  if (l<=r) then
  begin
    temp:=a[l];a[l]:=a[r];a[r]:=temp;
    l:=l+1;r:=r-1;
  end;
  until(l>r);
  if (left<r) then px(left,l-1);
  if (right>l) then px(r+1,right);
end;
begin
  for i:=1 to 10 do read(a[i]);readln;
  px(1,10);
  for i:=1 to 10 do writeln(a[i]);
end.

3 楼


[b][color=00FFFF][size=2]你写得很好,只差一点了!
你将WHILE循环后的两个'<'改成'>'即可!!
你要理解了快排,无论从大到小还是从小到大都没问题,加油!!!
上面是FREE PASCAL的程序,你可以看看!![/size][/color][/b]

我来回复

您尚未登录,请登录后再回复。点此登录或注册