StartprogrammingusingObjectPascal:ShellSortAlgorithm

From 흡혈양파의 번역工房
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

쉘 정렬 알고리즘

많은 양의 데이터가 있을 때 가장 빠른 정렬 방법이며, 데이터가 약간 정렬되어 있을 경우 버블 정렬과 유사하지만, 앞의 두 정렬 알고리즘보다는 좀 더 복잡합니다.

이 정렬 알고리즘의 이름은 창안자 도널드 쉘의 이름에서 따왔습니다.

program ShellSort;

{$mode objfpc}{$H+}

uses
    {$IFDEF UNIX}{$IFDEF UseCThreads}
    cthreads,
    {$ENDIF}{$ENDIF}
    Classes;

procedure ShellS(var X: array of Integer);
var
    Done: Boolean;
    Jump, j, i: Integer;
    Temp: Integer;

begin
    Jump:= High(X);
    while (Jump > 0) do // Outer loop
    begin
        Jump:= Jump div 2;
        repeat         // Intermediate loop
            Done:= True;
            for j:= 0 to High(X) - Jump do // Inner loop
            begin
                i:= j + Jump;
                if X[j] > X[i] then // Swap
                begin
                    Temp:= X[i];
                    X[i]:= X[j];
                    X[j]:= Temp;
                    Done:= False;
                end;
            end; // end of inner loop
        until Done; // end of intermediate loop
    end; // end of outer loop
end;
var
    Numbers: array [0 .. 9] of Integer;
    i: Integer;

begin
    Writeln('Please input 10 random numbers');
    for i:= 0 to High(Numbers) do
    begin
        Write('#', i + 1, ': ');
        Readln(Numbers[i]);
    end;
    ShellS(Numbers);
    Writeln;
    Writeln('Numbers after Shell sort: ');
    for i:= 0 to High(Numbers) do
    begin
        Writeln(Numbers[i]);
    end;
    Write('Press enter key to close');
    Readln;
end.