StartprogrammingusingObjectPascal:BubbleSortAlgorithm

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

버블 정렬 알고리즘

이 알고리즘은 단순한 정렬 알고리즘 중 하나입니다. 배열의 첫 번째 요소를 두 번째 요소와 비교해서 오름차순에서는 첫 번째 요소가 두 번째 요소보다 클 경우 서로 바꿉니다. 그 다음 두 번째 요소와 세 번째 요소를 비교하고, 이런식으로 배열의 마지막에 도달하기 전까지 계속 진행합니다. 그 후 배열이 이미 정렬되었다는 의미로 바꾸기 동작이 안 일어날 때까지 이 동작을 반복합니다.

배열에 다음 6개의 값을 지니고 있다고 가정해봅니다.

7
10
2
5
6
3

정렬을 하기 위해 한 바퀴 이상 돌아야 한다는 것을 알 것입니다.

첫번째 숫자를 두번째 것과 비교할 것이고 처음 것이 두번째 것보다 크면 바꾸기 동작이 일어날 것이며, 다섯번째 요소를 여섯번째 요소와 비교하기 전까지 두번째를 세번째와 비교할 것입니다.

처음 한 바퀴를 돌고 나면 배열은 다음과 같이 될 것입니다.

7
2
5
6
3
10

두 번째 바퀴 다음

2
5
6
3
7
10

세 번째

2
5
3
6
7
10

네 번째

2
3
5
6
7
10

네 바퀴를 돌고 나서 정렬된 배열을 얻게 되는데, 네 바퀴 째에서는 바꾸기 동작이 일어나지 않기 때문입니다. 이는 이들 데이터를 정렬하는데 세 바퀴만 도는 것이 필요하지만, 네 번째는 정렬의 발생을 확인하기 위해 사용한다는 것을 의미합니다.

작은 수가 큰 수 위로 거품처럼 떠다님을 알아 두도록 합니다.

다음은 버블 정렬 프로그램입니다.

program BubbleSortProj;

{$mode objfpc}{$H+}

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

procedure BubbleSort(var X: array of Integer);
var
    Temp: Integer;
    i: Integer;
    Changed: Boolean;
begin
    repeat // Outer loop
        Changed:= False;
        for i:= 0 to High(X) - 1 do // Inner loop
            if X[i] > X[i + 1] then
            begin
                Temp:= X[i];
                X[i]:= X[i + 1];
                X[i + 1]:= Temp;
                Changed:= True;
            end;
    until not Changed;
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;
    BubbleSort(Numbers);
    Writeln;
    Writeln('Numbers after sort: ');
    for i:= 0 to High(Numbers) do
    begin
        Writeln(Numbers[i]);
    end;
    Write('Press enter key to close');
    Readln;
end.

보다 큰(>) 연산자를 보다 작은(<) 연산자로 바꾸어서 내림차순 정렬로 정렬 방식을 수정할 수 있습니다.

if X[i] > X[i + 1] then

다음 예제에서는 학생의 등급을 큰 점수부터 작은 점수순으로(내림 차순으로) 정렬하도록 하겠습니다.