이름 | 평균 시간복잡도 | 최악 시간복잡도 | Stability | In-place | 활용 상황 |
---|---|---|---|---|---|
Bubble sort | O(n2) | O(n2) | stable | in-place | |
Selection sort | O(n2) | O(n2) | unstable | in-place | 작은 배열에서, 쓰기(swap) 비용이 클 때 활용 |
Insertion sort | O(n2) | O(n2) | stable | in-place | 일반적으로 작은 배열에서 활용 |
Quick sort | O(nlgn) | O(n2) | unstable | in-place | 원시 타입 배열에서, 최악 상황을 피할 수 있을 때 활용 |
Merge sort | O(nlgn) | O(nlgn) | stable | not in-place | 참조 타입 배열에서 활용 |
Heap sort | O(nlgn) | O(nlgn) | unstable | in-place | 원시 타입 배열에서, 자원적 한계가 클 때 활용 |
Counting sort | O(n+k) | O(n+k) | stable | not in-place | 원소의 종류가 한정적일 때 활용 |
Radix sort | O(w·n) | O(w·n) | LSD: stable MSD: unstable | not in-place | 자릿수가 있는, 이진 문자열이나 정수를 정렬할 때 활용 |
평균 O(n2)의 시간복잡도를 갖는 정렬 알고리즘들
각 원소에 대해서, 뒤로 가야하는 만큼 Swap을 거쳐 정렬하는 알고리즘
각 인덱스에 대해서, 뒤의 원소들 중 최소값을 골라 Swap하여 정렬하는 알고리즘
각 원소에 대해서, 앞의 원소들 중 자신보다 작은 값이 나올 때까지 Swap하여 정렬하는 알고리즘
평균 O(nlgn)의 시간복잡도를 갖는 정렬 알고리즘들
원소 중 하나를 피벗(pivot
)으로 고르고, 피벗 앞에는 작은 값들이, 뒤에는 큰 값들이 오도록 하며, 피벗을 기준으로 분할하여 재귀적으로 정렬하는 알고리즘
배열을 반씩 재귀적으로 나누고, 가장 작은 단위부터 차례대로 병합하여 정렬하는 알고리즘
힙 자료 구조에 원소를 넣고 빼는 개념을 활용하여 정렬하는 알고리즘
원소 간 비교 없이, O(n)의 시간복잡도를 갖는 정렬 알고리즘들
원소의 종류마다 세어서 개수 순으로 정렬하는 알고리즘
원소의 각 자릿수 기준 정렬을 반복하여 정렬하는 알고리즘
문제를 작은 문제들로 재귀적으로 분할함으로써 간단히하여 해결하는 알고리즘 설계 전략
수학적 최적화와 컴퓨터 프로그래밍을 통한 알고리즘 설계 전략
각 단계마다 순간적으로 최적인 선택을 이어가는 알고리즘
가장 가까운 노드를 선택해가면서 최소 스패닝 트리를 구하는 알고리즘
가장 짧은 간선을 선택해가면서 최소 스패닝 트리를 구하는 알고리즘
function backtrack(c):
if reject(P, c) then return
if accept(P, c) then output(P, c)
s := first(P, c)
while s ≠ NULL do
backtrack(s)
s ← next(P, s)
조건을 만족하는 해들을 구하기 위해, 유망한 후보들을 점진적으로 검사하는 알고리즘
하나의 최적해를 구하기 위해, 제한 범위 내의 후보들을 점진적으로 검사하는 알고리즘
노드 간 최단 거리를 구하는 알고리즘
음의 가중치가 없는 그래프에서, 한 노드에서 다른 모든 노드로의 최단 비용(SSP)을 구하는 알고리즘
function Dijkstra(Graph, source):
dist[source] ← 0 // 출발 정점에 대해 초기화
create vertex priority queue Q // 거리에 대한 Min-heap
for each vertex v in Graph:
if v ≠ source
dist[v] := INF
Q.add(v, dist[v])
while Q is not empty:
(u, cost) := Q.extract_min() // 다음으로 가장 빠른 정점
if dist[u] > cost // 갱신되었다면 무시함
continue
for each neighbor v of u:
alt := dist[u] + length(u, v)
if alt < dist[v]
dist[v] := alt // 이미 큐에 있는 v들은 앞으로 무시될 것임
Q.add(v, alt)
return dist
음수 사이클이 없는 그래프에서, 한 노드에서 다른 모든 노드로의 최단 비용(SSP)을 구하는 알고리즘
function BellmanFord(list vertices, list edges, vertex source):
dist := list of size n
// Step 1: 초기화
for each vertex v in vertices:
dist[v] := INF
dist[source] := 0 // 출발 정점에 대해 초기화
// Step 2: 완화(Relaxation)
repeat |V|−1 times:
for each edge (u, v) with weight w in edges:
if dist[u] + w < dist[v]
dist[v] := dist[u] + w
// Step 3: 음수 사이클 확인을 위해 같은 내용 한 번 더 실행
for each edge (u, v) with weight w in edges:
if dist[u] + w < dist[v]
error "Graph contains a negative-weight cycle"
return dist
각 노드에서 다른 모든 노드로의 최단 비용(ASP)을 구하는 알고리즘
let dist be a |V| × |V| array of minimum distances initialized to INF
for each edge (u, v):
dist[u][v] := w(u, v) // u에서 v로 가는 정점의 가중치
for each vertex v:
dist[v][v] := 0
for k from 1 to |V|:
for i from 1 to |V|:
for j from 1 to |V|:
if dist[i][j] > dist[i][k] + dist[k][j]
dist[i][j] := dist[i][k] + dist[k][j]