정렬 알고리즘(Sorting algorithm)
삽입 정렬(최악 O(n²)), 병합 정렬(merge sort)과 힙 정렬(최악 O(n log n)), 퀵정렬(평균(mean) O(n log n), 최악 O(n²)) 등 목록을 순서대로 늘어놓는 방법들과 그 비용.
정렬은 목록을 크기순으로 늘어놓는 일입니다. 컴퓨터가 하는 일 가운데 가장 흔한 것 중 하나이고, 정렬해 두면 이진 탐색(binary search)으로 빨리 찾고, 같은 것끼리 모으고, 중앙값(median)을 바로 읽을 수 있습니다. 방법은 수십 가지이지만, 두 원소(element)를 비교해 순서를 정하는 방법들은 비교 횟수로 비용을 잽니다.
알고리즘(algorithm)
삽입 정렬(insertion sort)은 카드를 손에 쥐듯, 새 원소를 이미 정렬된 앞부분의 알맞은 자리까지 한 칸씩 밀어 넣습니다. 한 칸 밀 때마다 순서가 뒤바뀐 쌍(역순쌍, inversion) 하나가 풀립니다. 그래서 역순쌍이 I개이면 비교 횟수는 I 이상
퀵정렬(quicksort)은 기준 원소(피벗, pivot)를 하나 골라 그보다 작은 것은 왼쪽, 큰 것은 오른쪽으로 가른 뒤 양쪽을 재귀(recursion)로 정렬합니다. 여기서는 구간의 마지막 원소를 피벗으로 씁니다. 무작위로 섞인 입력에서는 평균 비교 횟수가 n = 24일 때 약 93번이고, n이 커지면
이보다 크게 나아질 수는 없습니다. 비교만 쓰는 정렬은 최악의 경우 적어도
이어지는 곳. 병합 정렬은 1945년 폰 노이만이, 퀵정렬은 1960년 무렵 영국의 컴퓨터 과학자 호어가 고안했고, 오늘날 프로그래밍 언어의 표준 정렬은 이들을 섞어 쓰는 경우가 많습니다. 퀵정렬의 평균 비교 횟수는 기댓값의 선형성(여러 수를 더한 것의 기댓값은 각 기댓값의 합이라는 성질)과 조화급수(harmonic series)로 계산합니다. 퀵정렬처럼 가르되 k번째 원소가 든 한쪽만 따라가면(퀵셀렉트, quickselect), 전부 정렬하지 않고도 k번째로 작은 원소를 평균
이 개념이 나오는 긴 글
이 개념 위에 세워진 것
이 개념을 언급하는 페이지
- 진법
… 정렬은 자릿수가 정해져 있으면 수의 개수 n 에 비례하는 시간에 끝납니다. 두 수를 비교해 순서를 정하는정렬 알고리즘은 최악의 경우 n \log n 에 비례하는 비교를 피할 수 없는데, 기수 정렬은 비교를 하지 않아 이 …
- 조화급수
… 호어⟧가 고안한 정렬 방법으로, 기준값 하나를 골라 그보다 작은 것과 큰 것으로 나누는 일을 되풀이합니다(정렬 알고리즘). 기준값을 무작위로 고르면 n개를 정렬할 때 평균 비교 횟수가 약 2n\ln n 입니다. i번째로 작은 …
- 중앙값
… 더한 것이라 좌표마다 따로 가장 작게 하면 되기 때문입니다. 중앙값을 구하는 가장 쉬운 방법은 값들을정렬하는 것이지만, 더 빠른 방법이 있습니다. 퀵정렬처럼 기준값 하나를 골라 그보다 작은 값과 큰 값으로 나눈 …
- 지프의 법칙
책 한 권의 낱말을 모두 세어 가장 많이 나온 것부터 늘어놓아(정렬) 순위를 매기면 이상한 규칙이 보입니다. 2위 낱말은 1위의 절반쯤, 3위는 3분의 1쯤, 10위는 …
- 알고리즘
… 계산 도중 동전을 던지는 무작위 알고리즘입니다. 가장 많이 연구된 과제는 목록을 크기순으로 늘어놓는정렬과 목록에서 원하는 것을 찾는 탐색입니다. 알고리즘이 모든 입력에서 맞는 답을 내고 끝난다는 것은 몇 …
- 점근 표기법
… 도 같은 말투입니다. 알고리즘에서는 찾는 범위를 반씩 줄이는 이진 탐색의 O(\log n) , 좋은정렬의 O(n \log n) , 목록 크기와 상관없이 평균 일정한 걸음에 찾는 해시 테이블의 O(1) 이 …
- 이진 탐색
… 이 한계에 거의 딱 맞습니다. 같은 셈이 비교 정렬의 하한을 줍니다. 이진 탐색의 조건은 목록이 먼저정렬되어 있어야 한다는 것입니다. 정렬에는 이진 탐색보다 훨씬 많은 일이 드니, 여러 번 찾을 때에야 정렬에 …
- 분할 정복
… 모두 합쳐 n번쯤입니다. 그래서 전체는 n번씩 \log_2 n 층, 모두 n \log_2 n 정도입니다(정렬 알고리즘). 이제 일반화합니다. 한 문제를 반 크기 문제 a개로 나누고, 나누고 합치는 데 n^d 만큼 일한다고 …
- 해시 테이블
이름으로 전화번호를 찾는 일을 생각해 봅시다. 이름을정렬해 두고 이진 탐색을 하면 \log_2 n 번쯤 비교해야 하지만, 해시 테이블은 n이 아무리 커도 평균 …
- 힙과 우선순위 큐
… 이렇게 '가장 급한 것 꺼내기'와 '새 것 넣기'를 되풀이하는 자료 구조가 우선순위 큐입니다. 목록을 늘정렬된 채로 두면 새 것을 제자리에 끼워 넣는 데, 정렬하지 않고 두면 가장 작은 것을 처음부터 찾는 데 n에 …
- 무작위 알고리즘
… 것은 확실함을 버리는 일처럼 보이지만, 실은 '늘 느린 나쁜 입력'이라는 것을 없애는 방법이기도 합니다.퀵정렬을 보겠습니다. 늘 구간의 마지막 원소를 피벗으로 쓰면 이미 정렬된 입력에서 n(n-1)/2 번이나 …
- 최소 신장 트리
… 개입니다. 1956년 미국의 수학자 조지프 크러스컬이 내놓은 방법은 단순합니다. 모든 변을 짧은 것부터정렬해 놓고 차례로 보면서, 이미 이어진 두 점을 다시 잇는 변(순환을 만드는 변)이면 버리고 아니면 …