정렬 알고리즘에 대해 공부하려 한다. 이번 포스팅에서는 정렬 알고리즘의 개념과 안정성(Stability), 기초적인 비교 알고리즘에 대해 작성하고자 한다.
내부 정렬 : 입력의 크기가 주 기억 장치보다 크지 않음 -> 컴퓨터 메모리 내부에서 정렬
외부 정렬 : 입력의 크기가 매우 커서 보조 기억 장치에 저장해야 하는 경우에 사용하는 정렬, 보조기억장치에서 부분적으로 주 기억 장치로 옮기면서 처리되는 정렬
제자리 정렬 : 입력 크기에 비례하는 추가 공간을 필요로 하지 않는 알고리즘. 보통 공간 복잡도가 를 넘지 않으면 제자리 정렬 알고리즘이라고 한다.
예를 들어 점수와 학생 데이터가 있다고 하자.
| 점수 | 학생 |
|---|---|
| 90 | A |
| 80 | B |
| 90 | C |
| 70 | D |
점수를 기준으로 정렬하면
| 점수 | 학생 |
|---|---|
| 70 | D |
| 80 | B |
| 90 | A |
| 90 | C |
같은 점수 90인 데이터에서 A → C 순서가 유지된다.
| 점수 | 학생 |
|---|---|
| 70 | D |
| 80 | B |
| 90 | C |
| 90 | A |
같은 값 90의 순서가
A → C 에서 C → A 처럼 바뀌었다.
안정 정렬 종류 : 버블 정렬, 삽입 정렬, 병합 정렬, 팀 소트, 계수 정렬 등이 있다.
불안정 정렬 종류 : 선택 정렬, 퀵 정렬, 힙 정렬, 셸 정렬 등이 있다.

구현 코드
arr = [9, 6, 7, 3, 5]
min_idx = 0
for i in range(len(arr)-1):
min_idx = i # 최솟값의 인덱스
for j in range(i+1, len(arr)): # 실제 최솟값의 위치를 찾는 부분
if arr[min_idx] > arr[j]:
min_idx = j
temp = arr[min_idx] # 현재 위치의 값과 최소값을 Swap
arr[min_idx] = arr[i]
arr[i] = temp

구현 코드
arr = [7, 4, 5, 1, 3]
for i in range(len(arr)-1):
for j in range(0, len(arr)-1-i):
if arr[j+1] < arr[j]:
temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘이다.
매 순서마다 해당 원소를 삽입할 수 있는 위치를 찾아 해당 위치에 삽입한다.
key값은 2번째 인덱스부터 시작되며, key값이 자료의 길이만큼 이동되었을 때 정렬이 완성된다.
데이터가 이미 어느 정도 정렬된 상태라면 매우 효율적이다.

arr = [9, 4, 3, 5, 1]
for i in range(1, len(arr)):
key = arr[i]
j = i - 1 # arr[j] 는 key와 크기를 비교할 데이터의 인덱스
while j >= 0 and arr[j] > key:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = key
print(arr)
쉘 정렬 과정
def shell_sort(arr):
n = len(arr)
gap = n // 2
while gap > 0:
for i in range(gap, n):
temp = arr[i]
j = i
while j >= gap and arr[j - gap] > temp:
arr[j] = arr[j - gap]
j -= gap
arr[j] = temp
gap //= 2
return arr