StartprogrammingusingObjectPascal:ShellSortAlgorithm

From 흡혈양파의 번역工房
Jump to: navigation, search

쉘 정렬 알고리즘

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

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

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.