[perl] 정렬 알고리즘

이 블로그 포스트에서는 Perl을 사용하여 다양한 정렬 알고리즘을 구현하는 방법에 대해 알아보겠습니다. Perl을 사용하여 각 알고리즘을 구현하고, 각 알고리즘의 장단점과 성능 특성을 비교할 것입니다.

목차

  1. 버블 정렬
  2. 선택 정렬
  3. 삽입 정렬
  4. 병합 정렬
  5. 퀵 정렬

버블 정렬

버블 정렬은 인접한 두 원소를 비교하여 정렬하는 알고리즘입니다. Perl을 사용하여 버블 정렬을 구현하는 것은 간단합니다.

sub bubble_sort {
    my @array = @_;
    my $n = scalar @array;
    for my $i (0 .. $n-1) {
        my $swapped = 0;
        for my $j (0 .. $n-$i-2) {
            if ($array[$j] > $array[$j+1]) {
                ($array[$j], $array[$j+1]) = ($array[$j+1], $array[$j]);
                $swapped = 1;
            }
        }
        last unless $swapped;
    }
    return @array;
}

선택 정렬

선택 정렬은 주어진 리스트에서 최소값을 찾아 알맞은 위치로 옮기는 과정을 반복하여 정렬하는 알고리즘입니다. Perl을 사용하여 이 알고리즘을 구현해보겠습니다.

sub selection_sort {
    my @array = @_;
    my $n = scalar @array;
    for my $i (0 .. $n-1) {
        my $min_idx = $i;
        for my $j ($i+1 .. $n-1) {
            $min_idx = $j if $array[$j] < $array[$min_idx];
        }
        ($array[$i], $array[$min_idx]) = ($array[$min_idx], $array[$i]) if ($i != $min_idx);
    }
    return @array;
}

삽입 정렬

삽입 정렬은 배열을 정렬된 부분과 정렬되지 않은 부분으로 나누고, 정렬되지 않은 부분의 원소를 정렬된 부분의 올바른 위치에 삽입하는 과정을 반복하는 알고리즘입니다. Perl을 사용하여 삽입 정렬을 구현해보겠습니다.

sub insertion_sort {
    my @array = @_;
    for my $i (1 .. $#array) {
        my $key = $array[$i];
        my $j = $i - 1;
        while ($j >= 0 && $array[$j] > $key) {
            $array[$j + 1] = $array[$j];
            $j--;
        }
        $array[$j + 1] = $key;
    }
    return @array;
}

병합 정렬

병합 정렬은 분할 정복 알고리즘의 일종으로, 리스트를 반으로 나누어 각각을 정렬하고, 정렬된 부분 리스트를 병합하는 과정을 반복하여 정렬을 완성하는 알고리즘입니다. Perl을 사용하여 병합 정렬을 구현해보겠습니다.

sub merge_sort {
    my @array = @_;
    my $n = scalar @array;
    return @array if $n <= 1;
    my $mid = int($n / 2);
    my @left = merge_sort(@array[0 .. $mid-1]);
    my @right = merge_sort(@array[$mid .. $n-1]);
    return merge(\@left, \@right);
}

sub merge {
    my ($left, $right) = @_;
    my @result;
    while (@$left && @$right) {
        if ($left->[0] <= $right->[0]) {
            push @result, shift @$left;
        } else {
            push @result, shift @$right;
        }
    }
    push @result, @$left if @$left;
    push @result, @$right if @$right;
    return @result;
}

퀵 정렬

퀵 정렬은 분할 정복 알고리즘의 일종으로, 피벗을 기준으로 작은 원소들과 큰 원소들을 분할하여 각각을 정렬하는 알고리즘입니다. Perl을 사용하여 퀵 정렬을 구현해보겠습니다.

sub quick_sort {
    my @array = @_;
    return @array if @array <= 1;
    my $pivot = shift @array;
    my @smaller = grep {$_ < $pivot} @array;
    my @greater = grep {$_ >= $pivot} @array;
    return (quick_sort(@smaller), $pivot, quick_sort(@greater));
}

마무리

이제 Perl을 사용하여 다양한 정렬 알고리즘을 구현하는 방법에 대해 살펴보았습니다. 각 알고리즘의 성능과 특성에 대해 이해한 후, 실제 문제에 적용하여 효율적인 정렬을 수행할 수 있을 것입니다.