2. Divide & Conquer Algorithm (5) Others


Sanjoy Dasgupta가 저술한 책인 Algorithms과 이기창님의 블로그, Heee님의 블로그를 참고하였다.


그 밖의 정렬 알고리즘

다른 정렬 알고리즘을 간단하게 살펴보자.


1-1. Insertion Sort(삽입 정렬)

배열의 모든 요소를 앞에서부터 차례대로, 이미 정렬된 (앞의) 배열부분과 비교하여 자신의 위치를 찾아 삽입하며 정렬을 완성하는 알고리즘

방법은 다음과 같다. 데이터의 요소가 $n$개일 때,

  1. 두번째 요소와 앞의 배열부분(첫번째 요소)을 비교해 정렬
  2. 세번째 요소와 앞의 배열부분(첫번째, 두번째 요소)을 비교해 정렬
  3. 위 과정을 반복해 최종적으로 $n$번째 요소와 앞의 배열부분을 비교해 정렬하며 마무리

다음 데이터의 배열로 예를 들어보자

5, 2, 4, 6, 1, 3

2를 꺼내서 앞에 이미 정렬된 배열부분(5)과 비교한다. 5>2 이므로 자리를 바꿔준다

2, 5, 4, 6, 1, 3

4를 꺼내서 앞의 이미 정렬된 배열부분(2, 5)과 비교한다. 먼저 5와 비교하고, 5>4 이므로 자리를 바꿔준다. 그 뒤, 2와 비교하고, 4>2 이므로 그대로 둔다. 이 과정을 쭉 반복하면 다음과 같이 정렬을 완성할 수 있다.

2, 4, 5, 6, 1, 3 … 2, 4, 5, 6, 1, 3 … 1, 2, 4, 5, 6, 3 … 1, 2, 3, 4, 5, 6


1-2. Insertion Sort(삽입 정렬)의 특징


1-3. Insertion Sort(삽입 정렬)의 장단점


1-4. Insertion Sort(삽입 정렬)의 시간복잡도


2-1. Bubble Sort(버블 정렬)

서로 인접한 두 원소를 비교하여 크기 순서대로 정렬하는 알고리즘. 여러 번의 회전을 통해 정렬이 이루어진다.

방법은 다음과 같다. 데이터의 요소가 $n$개일 때,

  1. 첫번째 요소와 두번째 요소를 비교해 정렬
  2. 두번째 요소와 세번째 요소를 비교해 정렬
  3. 위 과정을 반복해 $n - 1$번째 요소와 $n$번째 요소를 비교해 정렬
  4. 이렇게 되면 가장 큰 값이 $n$번째 인덱스에 위치하게 됨. 지금까지가 1회전이다. 그리고 2회전을 시작한다. 1회전을 통해 구한 가장 큰 값을 제외하고 다시 1~3과정을 반복한다. 이를 $(n-1)$회전 시행하면 정렬을 완성할 수 있다.

cf) 선택 정렬이 두번째 요소와 첫번째 요소, 세번째 요소와 첫, 두번째 요소… 순으로(거꾸로 한꺼번에) 비교하는 거라면, 버블 정렬은 첫번째 요소와 두번째 요소, 두번째 요소와 세번째 요소…순으로(순차적으로 하나씩) 비교한다.

다음 데이터의 배열로 예를 들어보자.

7, 4, 5, 1, 3

7과 4를 비교한다. 7 > 4 이므로 바꿔준다.

4, 7, 5, 1, 3

5와 7을 비교한다. 7 > 5 이므로 그대로 바꿔준다.

4, 5, 7, 1, 3

위 과정을 반복하면 최종적으로 4, 5, 1, 3, 7을 얻을 수 있다. 가장 큰 값인 7이 맨 뒤로 오게 되었다. 이것으로 1회전을 마치고 이제는 가장 큰 값인 7을 제외한 나머지 값들로 2회전을 시작한다. 과정은 다음과 같다. 다시 한번 말하지만 7은 이미 가장 큰 값이므로 시간적 효율을 위해 가만히 냅둬야한다.

4, 5, 1, 3, (7) … 4, 1, 5, 3, (7) … 4, 1, 3, 5, (7)

2회전 결과 두번째로 큰 값인 5를 얻게 되었다. 이제 5와 7을 제외한 나머지 값들로 3회전을 시작한다. 다 하면 또 4회전을 시작한다. 총 (요소 개수 - 1)번만큼 위 과정을 반복해주는 것이다. 최종 결과는 다음과 같다.

1, 3, 4, 5, 7


2-2. Bubble Sort(버블 정렬)의 특징


2-3. Bubble Sort(버블 정렬)의 장단점


2-4. Bubble Sort(버블 정렬)의 시간복잡도


3-1. Selection Sort(선택 정렬)

최대값(혹은 최소값)을 찾은 뒤 맨 뒤(혹은 맨 앞)의 값과 교환하며 정렬하는 알고리즘. 여러 번의 회전을 통해 정렬이 이루어진다.

cf) 비교 횟수 측면에서는 하나의 요소가 나머지 모든 요소와 비교되므로 버블정렬과 같지만, 교환 횟수 측면에서는 하나의 요소가 최대값이랑만 교환되기 때문에 선택정렬이 더욱 효율적이다.

방법은 다음과 같다. 데이터 요소의 개수가 $n$개일 때,

  1. 요소 중, 최대값과 맨 끝의 값의 위치를 변경
  2. 맨 끝의 값 제외하고, 나머지 요소 중 최대값과 맨 끝의 값의 위치를 변경
  3. 위 과정을 $n - 1$번 반복

사진으로 예를 들면 다음과 같다.


3-2. Selection Sort(선택 정렬)의 특징


3-3. Selection Sort(선택 정렬)의 장단점


3-4. Selection Sort(선택 정렬)의 시간복잡도