Реферат: Сортировка
1.‹€Ž€’Ž€Ÿ €Ž’€ŽŽƒ€ŒŒˆŽ‚€ˆž“—…ˆŠ€ 10¤ Š‹€‘‘€ ˜ŠŽ‹› N57
€•Œ€Ž‚€‘…ƒ…Ÿ Ž ’…Œ…"‘Ž’ˆŽ‚Šˆ".
2.Ž‘’€Ž‚Š€ ‡€„€—ˆ.
„ ä ©«,ᮤ¥à¦ 騩 ç¨á« ⨯ longint,à ᯮ«®¦¥ë¥ ¢ ¯à®¨§¢®«ì®¬
¯®à浪¥.’ॡã¥âáïà ᯮ«®¦¨âì íâ¨ç¨á« ¯®¢®§à áâ ¨î,¨á¯®«ì§ãï ¥ ¡®«¥¥
40ª¨«®¡ ©â®¯¥à ⨢®© ¯ ¬ï⨨ ¤¨áª®¢®£®¯à®áâà á⢠¥¡®«¥¥ 祬 ¢ ¤¢
à § ¡®«ìè¥ ¨á室®£®ä ©« .
3.€‹ƒŽˆ’Œ (¬¥â®¤à¥è¥¨ï).
‘ ç « ¨áå®¤ë© ä ©«à §¡¨¢ ¥âáï ªã᪨ ¯® 10000 ç¨á¥«,ª ¦¤ë© ªã᮪
á®àâ¨àã¥âáï¢ ¯ ¬ï⨠¨§ ¯¨áë¢ ¥âáï ¢®¤¨ ¨§ ¤¢ãå ¢à¥¬¥ëåä ©«®¢, ¯à¨ç¥¬
â ª,çâ® ª®«¨ç¥á⢮ªã᪮¢ ¢ íâ¨åä ©« å®â«¨ç ¥âáï ¥ ¡®«¥¥ç¥¬ 1(¤ «¥¥ -
¯¥à¢® ç «ì ïá®àâ¨à®¢ª ).
‡ ⥬,¥áª®«ìª® à §¢ë¯®«ï¥âáﮯ¥à æ¨ï"᪫¥¨¢ ¨¥"(®¤®¢ë¯®«¥¨¥
®¯¥à 樨"᪫¥¨¢ ¨¥" ¬ë¡ã¤¥¬ ¥§ë¢ âì"è £"), â.¥ ¤¢ ¨á室ëå
ä ©« ,¢ ª®â®àëå 室¨«¨áì®âá®àâ¨à®¢ 륪ã᪨ ª®¯¨àãîâáï¢ ¤¢ ¤à㣨å
ä ©« ,¯à¨ í⮬ ¨§ ¤¢ãåªã᪮¢, 室ïé¨åáï ¢à §ëå ä ©« å ¨¨¬¥îé¨å
®¤¨ ª®¢ë¥®¬¥à ᮧ¤ ¥âáï ®¤¨®âá®àâ¨à®¢ 멪ã᮪. â®âªã᮪
§ ¯¨áë¢ ¥âáï¢ ¯¥à¢ë© ¢ë室®© ä ©«¥á«¨ ¨á室륪ã᪨ ¨¬¥«¨¥ç¥âë¥ ®¬¥à
¨ ¢®¢â®à®©, ¥á«¨¨áå®¤ë¥ ªã᪨¨¬¥«¨ ç¥âë¥ ®¬¥à .
4.‚“’…ŸŸ‘…–ˆ”ˆŠ€–ˆŸŽƒ€ŒŒ›.
ਠ¯¨á ¨¨¯à®£à ¬¬ë¨á¯®«ì§®¢ « áì á। Borland Pascal 7.0 ¨
¢áâ஥멪®¬¯¨«ïâ®à.
„«ïã᪮८£® ®¡¬¥ ᤨ᪮¬ ¯à¨¬¥ï«áï¡«®ª®¢ë© ¢¢®¤-¢ë¢®¤,â.¥
¨ä®à¬ æ¨ïç¨â ¥âáï ¨§ ¯¨áë¢ ¥âáï楫묨 ª« áâ¥à ¬¨.„«ï ®áãé¥á⢫¥¨ïí⮣®
ᯮᮡ ¢¢®¤ -¢ë¢®¤ ¡ë« ¯¨á ¬®¤ã«ì(Files), ᯮ¬®éìî ª®â®à®£®¢¢®¤-¢ë¢®¤
¢¥è¥¥ ®â«¨ç ¥âáï ®â®¡ë箣®.
‘奬 ¯à®£à ¬¬ë¯à¥¤¥«ì® ¯à®áâ :á ç « ¢ë¯®«ï¥âáﯥࢮ ç«ì ï
á®àâ¨à®¢ª (¯à®æ¥¤ãà firstsort), § ⥬ ¢ë§ë¢ ¥¬áª«¥¨¢ ¨¥(¯à®æ¥¤ãà
ftrans(in1, in2,out1, out2: workfile);), £¤¥ ¯ àë ä ©«®¢¢á¥ ¢à¥¬ï¬¥ïîâáï ¨
¯®á«¥ª ¦¤®£® § ¯ã᪠¯à®æ¥¤ãàë¯à®¢¥àï¥âáïãá«®¢¨¥ ¢ë室 .
à®æ¥¤ãà ftrans®âªàë¢ ¥â ¢á¥ä ©«ë, § ⥬¢ë¯®«ï¥â ¥áª®«ìª®à §
¯à®æ¥¤ãàã᫨¢ ®¤®£®ªã᪠(onestep) ¨§ ªàë¢ ¥â ä ©«ë.
5.ŠŽŒŒ…’ˆŽ‚€›‰ ’…Š‘’Žƒ€ŒŒ›.
{Œ®¤ã«ìFiles.
‘¤¥á쯥९¨á ë ¢á¥¯à®æ¥¤ãàë ¨äãªæ¨¨ ¥®¡å®¤¨¬ë¥¤«ï à ¡®âë áä ©« ¬¨,
à ¡®â îé¨¥á ¡«®ª ¬¨. ¡®â á ¨¬¨®áãé¥á⢫ï¥âáïâ ª¦¥ ª ª ¨ á
®¡ëç묨¯à®æ¥¤ãà ¬¨ ¬®¤ã«ïSystem.}
unit Files;
interface
const typesize=4;
const bufsize =2048;
typeusing=longint;
type buffer =array[1..bufsize] of using;
type pbuffer =^buffer;
type filemode =(fread, fwrite, closed);
type tfile =record
buf: pbuffer;
mode: filemode;
f: file;
count, leng: integer;
end;
procedure fAssign(varw: tfile; name: string);
procedurefReWrite(var w: tfile);
procedurefReset(var w: tfile);
procedurefPut(var w: tfile; d: using);
procedurefGet(var w: tfile; var d: using);
procedurefClose(var w: tfile);
function fEof(varw: tfile): boolean;
implementation
procedurefAssign(var w: tfile; name: string);
begin
Assign(w.f, name);
w.mode:=closed;
end;
procedurefReWrite(var w: tfile);
begin
if w.mode=closed then
begin
ReWrite(w.f, typesize);
new(w.buf);
w.count:=0;
w.leng:=0;
w.mode:=fwrite;
end;
end;
procedurefReset(var w: tfile);
begin
if w.mode=closed then
begin
Reset(w.f, typesize);
new(w.buf);
BlockRead(w.f, w.buf^, bufsize, w.leng);
w.count:=1;
w.mode:=fread;
end;
end;
procedurefPut(var w: tfile; d: using);
begin
if w.mode=fwrite then
begin
w.count:=w.count+1;
w.buf^[w.count]:=d;
if w.count=bufsize then
begin
BlockWrite(w.f, w.buf^, w.count);
w.count:=0;
end;
end;
end;
procedurefGet(var w: tfile; var d: using);
begin
if (w.mode=fread) then
begin
d:=w.buf^[w.count];
if w.leng=w.count then
begin
BlockRead(w.f, w.buf^, bufsize, w.leng);
w.count:=1;
end else w.count:=w.count+1;
end;
end;
procedurefClose(var w: tfile);
begin
if w.mode=fwrite then BlockWrite(w.f, w.buf^,w.count);
dispose(w.buf);
w.mode:=closed;
Close(w.f);
end;
function fEof(varw: tfile): boolean;
begin
if (w.mode=fread) and (w.leng=0) thenfEof:=true
else fEof:=false;
end;
begin
end.
{ª®¥æfiles.pas}
{----------------------------------------------------------------------------}
{” ©«sort.pas — á®àâ¨à®¢ª ¢¯ ¬ïâ¨.}
var k: integer;
functionSwapTops(no: integer): integer;
var t: longint;
begin
if (memo^[2*no+1]>memo^[2*no]) then
begin
t:=memo^[no];
memo^[no]:=memo^[2*no+1];
memo^[2*no+1]:=t;
SwapTops:=2*no+1;
end else
begin
t:=memo^[no];
memo^[no]:=memo^[2*no];
memo^[2*no]:=t;
SwapTops:=2*no;
end;
end;
procedureSwapHalf(no: integer);
var t: longint;
begin
if memo^[no]<memo^[2*no] then
begin
t:=memo^[no];
memo^[no]:=memo^[2*no];
memo^[2*no]:=t;
end;
end;
function Reg(no:integer): boolean;
begin
if (2*no)>k then Reg:=true else
if (2*no+1)>k then
begin
SwapHalf(no);
Reg:=true;
end else
if (memo^[2*no]<=memo^[no]) and(memo^[2*no+1]<=memo^[no]) then Reg:=true
else Reg:=false;
end;
procedureHalfReg(no: integer);
var next:integer;
begin
next:=no;
while (not Reg(next)) do next:=SwapTops(next);
end;
procedureRegTree;
var i: integer;
begin
for i:=k downto 1 do HalfReg(i);
end;
procedureSwapLeaves(l1, l2: integer);
var t: longint;
begin
t:=memo^[l1];
memo^[l1]:=memo^[l2];
memo^[l2]:=t;
end;
procedureSortMemo(len: integer);
begin
k:=len;
RegTree;
for k:=len-1 downto 1 do
begin
SwapLeaves(1, k+1);
HalfReg(1);
end;
end;
{ª®¥æsort.pas}
{----------------------------------------------------------------------------}
{Žá®¢ ﯮ£à ¬¬ }
uses Dos,Files{®¤ª«î票¥ ¬®¤ã«ï,®áãé¥á⢫ïî饣®¢¢®¤-¢ë¢®¤.};
constmemlen=10000;{ §¬¥à ¯ ¬ïâ¨,à §à¥è¥®© ¤«ï¨á¯®«ì§®¢ ¨ï}
type tmemo =array[0… memlen] of longint;
type pmemo = ^tmemo;{’¨¯-㪠§ â¥«ì ®á®¢®© ¬ áᨢ,¨á¯®«ì§ã¥¬ë©
¯à®£à ¬¬®©}
var memo: pmemo;
{$I sort.pas}{®¤ª«î票¥ ä ©« ,ᮤ¥à¦ 饣®¯à®æ¥¤ãàãá®àâ¨à®¢ª¨
¬ áᨢ § ¢à¥¬ï n*(log n), ¥¨á¯®«ì§ã冷¯®«¨â¥«ì®©¯ ¬ïâ¨(á®àâ¨à®¢ª
¤¥à¥¢®¬).}
type workfile =record
main{®á®¢®© ä ©«},
inf{ä ©«,ᮤ¥à¦ 騩 ¤«¨ë®âá®àâ¨à®¢ ëåªã᪮¢}: tfile;
end;{tfile — ⨯, ®¯à¥¤¥«¥ë© ¢ unitFiles, ª®â®àë© § ¬¥ï¥âä ©«®¢ë¥ ⨯ë}
var
t1, t2, t3, t4, dest, seur: workfile;
{¢à¥¬¥ë¥ä ©«ë} {¢å®¤®© ¨ ¢ë室®© ä ©«}
{ˆ¨æ¨ «¨§ æ¨ï}
procedure Init;
var tmp: string;
begin
tmp:=getenv('TEMP');
fAssign(t1.main, tmp+'~fsort-1.tmp');
fAssign(t2.main, tmp+'~fsort-2.tmp');
fAssign(t3.main, tmp+'~fsort-3.tmp');
fAssign(t4.main, tmp+'~fsort-4.tmp');
fAssign(t1.inf, tmp+'~finf-1.tmp');
fAssign(t2.inf, tmp+'~finf-2.tmp');
fAssign(t3.inf, tmp+'~finf-3.tmp');
fAssign(t4.inf, tmp+'~finf-4.tmp');
fAssign(seur.main,ParamStr(1));
fAssign(dest.main,ParamStr(2));
end;
{¥à¢® ç «ì ïá®àâ¨à®¢ª }
procedurefirstsort(var inp, out1, out2: workfile);
var i, k:longint;
begin
fReset(inp.main);
fRewrite(out1.main);
fRewrite(out2.main);
fRewrite(out1.inf);
fRewrite(out2.inf);
new(memo);
repeat
for i:=1 to memlen do
if fEof(inp.main) then
begin
i:=i-1;
break
end else fGet(inp.main, memo^[i]);
k:=i;
sortmemo(k);
for i:=1 to k do fPut(out1.main, memo^[i]);
fPut(out1.inf, k);
if k=memlen then
begin
for i:=1 to memlen do
if fEof(inp.main) then
begin
i:=i-1;
break;
end
else fGet(inp.main, memo^[i]);
k:=i;
sortmemo(k);
for i:=1 to k do fPut(out2.main, memo^[i]);
fPut(out2.inf, k);
end;
until fEof(inp.main);
dispose(memo);
fClose(inp.main);
fClose(out1.main);
fClose(out2.main);
fClose(out1.inf);
fClose(out2.inf);
end;
{à®æ¥¤ãà ,ª®¯¨àãîé ï§ ¤ ®¥ ª®«¨ç¥á⢮í«-⮢ ¨§ ®¤®£® ä ©« ¢¤à㣮©.
ˆá¯®«ì§ã¥âáï¯à¨ ᫨¢ ¨¨ ¤«ïª®¯¨à®¢ ¨ï®á⠢襩áï ç á⨪ã᪠(¥á«¨¤à㣮©
ªã᮪¨ááïª).}
procedureCopy(var inp, out: workfile; c0: longint);
var
c, n: longint;
Done: boolean;
begin
for c:=c0 downto 1 do
begin
fGet(inp.main, n);
fPut(out.main, n);
end;
end;
{‘«¨¢ ¥â¤¢ ®ç¥à¥¤ëåªã᪠¨§ ä ©«®¢ in1 ¨ in2¨ § ¯¨áë¢ ¥â ¢ out.}
procedureonestep(var in1, in2, out: workfile; c01, c02: longint);
var n1, n2, c1,c2, c: longint;
Done: boolean;
begin
Done:=false;
c1:=c01-1;
c2:=c02-1;
c:=0;
fGet(in1.main, n1);
fGet(in2.main, n2);
repeat
if n1<n2 then
begin
fPut(out.main, n1);
c:=c+1;
if c1=0 then
begin
fPut(out.main, n2);
c:=c+1;
Copy(in2, out, c2);
c:=c+c2;
Done:=true;
end else
begin
fGet(in1.main, n1);
c1:=c1-1;
end;
end else
begin
fPut(out.main, n2);
c:=c+1;
if c2=0 then
begin
fPut(out.main, n1);
c:=c+1;
Copy(in1, out, c1);
c:=c+c1;
Done:=true;
end else
begin
fGet(in2.main, n2);
c2:=c2-1;
end;
end;
until Done;
end;
{à®æ¥¤ãà ®áãé¥á⢫ï¥â ®¤¨è £(â.¥.ª®¯¨àã¥â ä ©«ë in1 ¨in2 ¢ out1 ¨ out2,
¯à¨í⮬ ᪫¥¨¢ ïªã᪨)}
procedureftrans(var in1,in2,out1,out2: workfile);
var c1, c2, c:longint;
begin
fReset(in1.main);
fReset(in2.main);
fReset(in1.inf);
fReset(in2.inf);
fRewrite(out1.main);
fRewrite(out2.main);
fRewrite(out1.inf);
fRewrite(out2.inf);
while (not fEof(in1.inf)) and (notfEof(in2.inf)) do
begin
fGet(in1.inf, c1);
fGet(in2.inf, c2);
onestep(in1, in2, out1, c1, c2);
c:=c1+c2;
fPut(out1.inf, c);
if (not fEof(in1.inf)) and (notfEof(in2.inf)) then
begin
fGet(in1.inf, c1);
fGet(in2.inf, c2);
onestep(in1, in2, out2, c1, c2);
c:=c1+c2;
fPut(out2.inf, c);
end;
end;
if fEof(in1.inf) xor fEof(in2.inf) then
if fEof(in1.inf) then
begin
fGet(in2.inf, c2);
Copy(in2, out2, c2);
fPut(out2.inf, c2);
end else
if fEof(in2.inf) then
begin
fGet(in1.inf, c1);
Copy(in1, out2, c1);
fPut(out2.inf, c1);
end;
fClose(in1.main);
fClose(in2.main);
fClose(in1.inf);
fClose(in2.inf);
fClose(out1.main);
fClose(out2.main);
fClose(out1.inf);
fClose(out2.inf);
end;
{Š®¯¨à®¢ ¨¥ä ©« f1 ¢f2.(ˆá¯®«ì§ã¥âáï¯à¨ § ¢¥à襨¨à ¡®âë ¤«ï
ª®¯¨à®¢ ¨ïª®¥ç®£® ä ©« ¨§¢à¥¬¥®©¤¨à¥ªâ®à¨¨ ¢ãª § ãî).}
procedureFCopy(f1, f2: tfile);
var t: longint;
begin
write('ª®¯¨à®¢ ¨¥');
fRewrite(f2);
fReset(f1);
while (not fEof(f1)) do
begin
fGet(f1, t);
fPut(f2, t);
end;
fClose(f1);
fClose(f2);
end;
{ਨ¬ ¥â§ 票¥ True, ¥á«¨ ä ©« ®âá®àâ¨à®¢ ¨ ¡®«ìè¥ ¥ ¤®áª«¥¨¢ âì.
(“á«®¢¨¥¢ë室 )}
function Fin:boolean;
begin
fReset(t2.main);
fReset(t4.main);
if fEof(t2.main) then
begin
Fin:=true;
FCopy(t1.main, dest.main);
end else
if fEof(t4.main) then
begin
Fin:=true;
FCopy(t3.main, dest.main);
end else Fin:=false;
fClose(t2.main);
fClose(t4.main);
end;
begin
writeln;
if ParamCount<2 then
begin
writeln('‘«¨èª®¬ ¬ «®¯ à ¬¥â஢.');
Exit;
end;
write('ˆ¨æ¨ «¨§ æ¨ï...');
Init;
writeln('£®â®¢®');
write('¥à¢® ç «ì ïá®àâ¨à®¢ª ...');
firstsort(seur, t1, t2);
writeln('£®â®¢®');
ReWrite(dest.main.f);
Close(dest.main.f);
writeln('‘ª«¥¨¢ ¨¥:');
repeat
ftrans(t1, t2, t3, t4);
writeln('è £');
if (not Fin) then
begin
ftrans(t3, t4, t1, t2);
writeln('è £');
end;
until Fin;
writeln('£®â®¢®');
end.
{----------------------------------------------------------------------------}
6.‚…˜ŸŸ ‘…–ˆ”ˆŠ€–ˆŸ.
„«ïª®àà¥ªâ®©à ¡®âë¯à®£à ¬¬ë ¥®¡å®¤¨¬ ª®¬¯ìîâ¥àAT286, 40K ᢮¡®¤®©
conventional¯ ¬ïâ¨,®¯¥à 樮 ïá¨á⥬ MS-DOS 3.0 ¨«¨¡®«¥¥ ¯®§¤ïàá¨ï.
‚®§¬®¦ë¢¥àᨨ¯à®£à ¬¬ë,¨á¯®«ì§ãî騥¬¥ìè¥ ¯ ¬ïâ¨,¯à®æ¥áá®àëá« ¡¥¥ 286 ¨
â.¤.à®£à ¬¬ ¨á¯®«ì§ã¥â ¬¥áâ® ¤¨áª¥ ¢¤¢®¥¡®«ì襥 ¨á室®£®ä ©« (¥
áç¨â ïïá ¬ ä ©«).
7.“ŠŽ‚Ž„‘’‚Ž Ž‹œ‡Ž‚€’…‹Ÿ.
ਧ ¯ã᪥¯à®£à ¬¬ë®¡ï§ â¥«ì® ¤®«¦ ¡ëâì ®¯à¥¤¥«¥ ¯¥à¥¬¥ ï á।ë TEMP!
”®à¬ ⧠¯ã᪠¯à®£à ¬¬ë:
f_sort[.exe] <¢å®¤®©ä ©«> <¢ë室®© ä ©«>
à®£à ¬¬ ¥ § ¤ ¥â ¨ ª ª¨å¢®¯à®á®¢, çâ®á¨«ì® ã¯à®é ¥âà ¡®âã á ¥©.
¥§ã«ìâ âà ¡®âë ¬®¦®¯®¢¥à¨âì ᯮ¬®éìî ¯à¨« £ ¥¬®©ã⨫¨âë f_check,
ᮧ¤ âìá«ãç ©ë© ¨á室ë©ä ©« — á ¯à®¬®éìî f_make.
à¨ç¨ ¬¨®è¨¡®ª ¬®£ãâá«ã¦¨âì ¥á®®â¢¥âá⢨¥ á¨á⥬ëâॡ®¢ ¨ï¬,
¨§«®¦¥ë¬¢ ¯. 6, ¥¤®áâ â®ç®¥¬¥áâ® ¤¨áª¥,à §¬¥à(¢ ¡ ©â å)¨á室®£®
ä ©« ¥ ªà ⥠4.
‚ ¤ ®¬®âç¥â¥®¯¨áë¢ ¥âáïá ¬ ïí䥪⨢ ï ¢¥àá¨ïí⮩ ¯à®£à ¬¬ë, ®
áãé¥áâ¢ãî⢥àᨨ, ¥¨á¯®«ì§ãî騥¢¢®¤-¢ë¢®¤ ¡«®ª ¬¨, âॡãî騥¬¥ìè¥
à¥áãàᮢá¨á⥬ë.
8.Žˆ‘€ˆ… ’…‘’Ž‚.
à®£à ¬¬¬ â¥áâ¨à®¢ « á쥮¤®ªâ â®, ¢å®¤¥¨á¯®«ì§®¢ «¨áì, ¢®á®¢®¬,
ä ©«ë¨§ á«ãç ©ëåç¨á¥« à §«¨ç®© ¤«¨ë. ¢ë室¥ ¡ë«¨¯®«ãç¥ë ä ©«ë ⮩¦¥
¤«¨ë,¥ ᮤ¥à¦ 騥®è¨¡®ª, â.¥. ç¨á« ¢ íâ®å ä ©« å ®ª § «¨áì¢ ¯®à浪¥
¥áâண®£®¢®§à áâ ¨ï.‘®¤¥à¦¨¬®¥ íâ¨å ä ©«®¢¯®«®áâìî ᮢ¯ «® á
à §ã«ìâ â ¬¨à ¡®âë ¤à㣨å¯à®£à ¬¬á®àâ¨à®¢ª¨ â¥å¦¥ ¢å®¤ëå ä ©« å,çâ®
ᨫì®á¨¦ ¥â¢¥à®ïâ®áâ줨䥪⮢¯à®£à ¬¬ë.
à¨â¥áâ¨à®¢ ¨¨¨á¯®«ì§®¢ «¨á쮯¥à 樮ë¥á¨á⥬ë MS-DOS 6.22,
Windows`95,ª®¬¯ìîâ¥àë PC AT 486DX4-100,486SX-25, à ¡®â î騥 á«®ª «ìë¬
¢¨ç¥áâ¥à®¬,஡®ç¨¥ áâ 樨486DX-40, 386SX, à ¡®â î騥¢ á¥â¨ Novell.
¥§ã«ìâ âëâ¥áâ¨à®¢ ¨ï( ä ©«¥ à §¬¥à®¬ 4M)§ ¥á¥ë ¢ â ¡«¨æã:
ª®¬¯ìîâ¥à à ¡®â ¢ á¥â¨ ¢à¥¬ï à ¡®âë
486DX4-100 ¥â 3 ¬¨.
486SX-25 ¥â 7 ¬¨.
486DX-40 ¤
386SX ¤