快排?要不会退化的pascal

来源:百度知道 编辑:UC知道 时间:2024/07/07 10:21:29

楼上的是普通的快排,遇到有大部分有序的数列就会降O(N^2)的级别,主要是要用随机化,这样就是O(nlog2g)级别的,且只有极小的几乎是不可能的几率会降级
var a:array[1..100000]of longint;
i,n:longint;
procedure paixu(i1,j1:longint);
var i2,j2,x,p:longint;
begin
if i1>=j1 then exit;
p:=random(j1-i1+1)+i1;
x:=a[p];a[p]:=a[i1];
i2:=i1;j2:=j1;
while i2<>j2 do
begin
while(i2<>j2)and(a[j2]>x) do dec(j2);
if i2<>j2 then begin a[i2]:=a[j2];inc(i2);end;
while(i2<>j2)and(a[i2]<x) do inc(i2);
if i2<>j2 then begin a[j2]:=a[i2];dec(j2);end;
end;
a[i2]:=x;
paixu(i1,i2-1);paixu(i2+1,j1);
end;
begin
randomize;
readln(n);
for i:=1 to n do read(a[i]);readln;
paixu(1,n);
for i:=1 to n-1 do write(a[i],' ');writeln(a[n]);
end.

procedure QuickSort(var A: List; Lo, Hi: Integer);

procedure Sort(l, r: Integer);
var
i, j, x, y: