주어진 데이터 중에서 가장 작은 값부터 차례대로 ‘선택’해서 나열하는 방식

(1단계) 정렬되지 않은 데이터 중 최소값 10 선택 → 미정렬 데이터 중 첫번째 원소 60과 자리 바꾸기
- 최소값 찾기까지 (n-1)번 비교함
(2단계) 정렬되지 않은 데이터 중 최소값 20 선택 → 미정렬 데이터 중 첫번째 원소 20이므로 자리 유지
- 최소값 찾기까지 (n-2)번 비교함
(n-1단계) 반복
- 총 1+2+3+…+(n-1)번 비교함 → $\frac {n(n-1)} 2$
→ $O(n^2)$
왼쪽에서부터 모든 인접한 두 데이터를 차례대로 비교하여 왼쪽의 값이 더 큰 경우에는 오른쪽 값과 자리를 바꾸는 과정을 통해 정렬
과정
왼쪽부터 오른쪽 끝까지 버블 정렬을 진행한다. 한 단계가 끝나면 가장 큰 값이 가장 오른쪽에 온다.

1에서 가장 마지막에 온 값(80)을 제외한 나머지를 기준으로 다시 왼쪽부터 오른쪽으로 진행한다.
위 과정을 반복하면, 4단계를 마친 후 부터는 자리가 변경되지 않는다. 5단계를 진행 후에도 자리가 바뀌지 않는다면, 6, 7단계는 생략이 가능하다.

데이터의 입력 상태에 따라 성능이 달라짐
선택 정렬에 비해 데이터 교환이 더 많이 발생
주어진 데이터를 하나씩 뽑은 후,
나열된 데이터들이 항상 정렬된 형태를 가지도록 뽑은 데이터를 바른 위치에 ‘삽입’해서 나열하는 방식

동일한 크기의 두 개의 부분배열로 분할하고, 각 부분배열을 순환적으로 정렬한 후,
정렬된 두 부분배열을 병합하여 하나의 정렬된 배열을 만드는 방식


1. 왼쪽 절반, 오른쪽 절반의 앞부터 비교(34 vs 16)해서 작은 값 16 넣기
2. 34 vs 23 → 23
3. 34 vs 52 → 34
4. (반복)
5. 89 vs 67 → 67
6. 남는 89를 넣기 ⇒ 정렬된 하나의 부분 배열
L 포인터 기준 89를 찾고, R 포인터 기준 23을 찾음 (L<R)
각 포인터가 가리키는 값의 위치를 바꿈 (L<R)
다시 찾고, 위치 바꾸기를 반복 (L<R)
L이 R보다 더 오른쪽에 오게 되면, 찾기 종료 (L>R)
마지막 R 포인터가 가리키는 값과 피벗의 자리 바꿔서 피벗이 제자리를 잡고, 분할 종료
→ 해당 과정을 계속 반복 (피벗을 기준을 분할만 계속 진행)
💡 트리 (tree)
노드 혹은 정점으로 구성된 논리적인 계층이 있는 구조

💡 이진 트리 (binary tree)
모든 노드가 2개 이하의 자식 노드를 갖는 트리

왼: 이진 트리 / 오: 이진 트리 아님
💡 완전 이진 트리 (complete binary tree)
마지막 레벨을 제외한 모든 레벨이 완전히 채워지고, 마지막 레벨은 왼쪽부터 오른쪽으로 차례로 채워진 이진 트리



힙 구조를 사용하여 데이터를 정렬하는 방식
정렬 방법
예) 무작위로 주어진 수(6 9 10 4 5 1 12 3)를 오름차순으로 정렬한다.
데이터 삽입 순서대로 이진 탐색 트리를 만든다.

부모 노드보다 값이 큰 자식 노드는 부모 노드와 교환하여, 최대 힙을 구현한다.

루트 노드(12)를 마지막 노드(3)와 교환하고 다시 힙 구조로 재배열 한다. 교환된 루트 노드(12)는 정렬을 확정한다.
정렬이 확정된 노드를 제외한 나머지 노드들을 기준으로 3의 과정을 반복한다.
모든 과정을 반복하면 배열이 오름차순으로 정렬된다.
시간 복잡도
장점
단점