도구스개발

정렬 알고리즘 비교·교환 횟수 계산기

숫자를 넣으면 버블·선택·삽입·병합·퀵·힙 정렬의 비교 횟수와 교환·이동 횟수를 한 표에서 견줍니다. 회전마다 배열이 어떻게 바뀌는지도 함께 볼 수 있습니다.

공백이나 쉼표로 구분합니다. 40개까지 봅니다.

비교 횟수가 가장 적은 것

삽입 정렬

비교 16회 · 원소 8개

알고리즘비교교환·이동비교가 최악의 몇 %
버블 정렬2511 교환89%
선택 정렬283 교환100%
삽입 정렬1617 이동57%
병합 정렬1748 이동61%
퀵 정렬1611 교환57%
힙 정렬2619 교환93%
원소 수8개
역위(앞이 뒤보다 큰 쌍) 수11개
모든 쌍의 수 n(n−1)/228개
이미 정렬되어 있는가아니오
버블 정렬의 교환 횟수와 삽입 정렬이 밀어낸 횟수가 둘 다 역위 수(11)와 정확히 같습니다. 역위란 앞이 뒤보다 큰 쌍입니다. 버블은 붙어 있는 것끼리만 바꾸므로 한 번 바꿀 때 역위가 정확히 하나 줄고, 삽입도 한 칸씩 밀어낼 때마다 하나씩 없앱니다. 겉보기에 전혀 다른 두 알고리즘이 실은 같은 일을 하고 있다는 뜻이고, 그래서 «거의 정렬된» 입력에서 둘 다 빨라집니다.
선택 정렬의 비교는 입력과 무관합니다. 남은 구간을 언제나 끝까지 훑어 최솟값을 찾기 때문에 무엇이 들어와도 n(n−1)/2 = 28회입니다. 이미 정렬된 배열을 줘도 한 번도 줄지 않습니다 — 대신 교환은 0회로 떨어집니다. 원소를 옮기는 비용이 큰 경우(레코드가 무거울 때)에만 이 성질이 이득입니다.
회전배열
시작5 2 9 1 5 6 3 8
12 5 1 5 6 3 8 9
22 1 5 5 3 6 8 9
31 2 5 3 5 6 8 9
41 2 3 5 5 6 8 9
51 2 3 5 5 6 8 9
무엇을 세는지 밝혀야 답이 맞춰집니다. 여기서는 «비교»를 두 원소를 견준 횟수로, «교환»을 두 원소의 자리를 맞바꾼 횟수로, «이동»을 원소를 다른 칸에 쓴 횟수로 셉니다. 교환 한 번은 원소를 두 칸에 쓰는 것이라 이동으로 환산하면 2회이므로, 교환 횟수와 이동 횟수를 곧바로 견주면 안 됩니다. 퀵 정렬은 로무토 분할을 쓰고 피벗은 «마지막 원소»으로 고릅니다.
중앙값 피벗도 공짜가 아닙니다. 세 값을 견주는 데만 매번 비교 세 번이 들어, 원소가 몇 개 안 되면 오히려 손해입니다. 정렬된 5개에서는 마지막 원소 피벗이 10회·중앙값이 15회지만, 8개에서 뒤집히고 16개면 120회 대 62회로 벌어집니다. 실제 라이브러리가 작은 구간에서 삽입 정렬로 갈아타는 이유가 이 언저리입니다.
병합 정렬의 이동 횟수는 입력이 어떻게 생겼든 똑같습니다 — 층마다 n번씩 옮기고 되돌리기 때문입니다. 비교는 조금 달라지는데 방향이 직관과 어긋나서, 길이가 2의 거듭제곱이면 정렬된 입력과 역순 입력이 같고(16개면 둘 다 32회) 그 밖의 길이에서는 오히려 역순 쪽이 적습니다(20개면 40회 대 48회). 한쪽 조각이 통째로 작으면 그쪽을 다 쓰고 나머지는 비교 없이 옮겨 담기 때문입니다.

사용 방법

  1. 1정렬할 숫자를 공백이나 쉼표로 구분해 넣습니다.
  2. 2여섯 알고리즘의 비교·교환 횟수를 한 표에서 견줍니다.
  3. 3퀵 정렬의 피벗 규약과 버블 정렬의 조기 종료 여부를 바꿔 가며 횟수가 어떻게 달라지는지 봅니다.
  4. 4회전마다의 배열을 볼 알고리즘을 골라 과정을 따라갑니다.

자주 묻는 질문

입력과 무관하게 언제나 n(n−1)/2회입니다. 남은 구간을 끝까지 훑어 최솟값을 찾기 때문에 이미 정렬된 배열을 줘도 한 번도 줄지 않습니다. 대신 교환은 최대 n−1회로 적고, 이미 정렬돼 있으면 0회입니다.

역위(앞이 뒤보다 큰 쌍)의 개수와 정확히 같습니다. 붙어 있는 것끼리만 바꾸므로 한 번 바꿀 때 역위가 정확히 하나 줄기 때문입니다. 삽입 정렬에서 한 칸씩 밀어낸 횟수도 같은 이유로 역위 수와 같아, 겉보기에 다른 두 알고리즘이 실은 같은 일을 합니다.

삽입 정렬이 비교 n−1회, 이동 0회로 끝나 가장 빠릅니다. 반대로 첫 원소나 마지막 원소를 피벗으로 잡는 퀵 정렬은 분할이 한쪽으로만 쏠려 바로 이 입력에서 최악(n(n−1)/2회 비교)이 됩니다. 같은 O(n log n) 표기 안에서도 입력에 따라 순위가 뒤집힙니다.

원소가 어느 정도 많을 때만 이득입니다. 세 값을 견주는 데도 비교가 들어, 정렬된 5개에서는 마지막 원소 피벗이 10회·중앙값이 15회로 오히려 손해입니다. 8개에서 뒤집히고 16개면 120회 대 62회로 크게 벌어집니다. 실제 라이브러리가 작은 구간에서 삽입 정렬로 갈아타는 이유가 이 언저리입니다.

비교는 두 원소를 견준 횟수, 교환은 두 원소의 자리를 맞바꾼 횟수, 이동은 원소를 다른 칸에 쓴 횟수로 셉니다. 교환 한 번은 원소를 두 칸에 쓰는 것이라 이동으로 환산하면 2회이므로 두 값을 곧바로 견주면 안 됩니다. 반복문 조건에서 인덱스끼리 견주는 것은 비교로 세지 않습니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 세는 규약을 밝히지 않으면 교재마다 답이 다릅니다. 여기서는 비교는 원소끼리 견준 횟수, 교환은 자리 맞바꿈, 이동은 칸에 쓴 횟수로 세며, 삽입 정렬은 마지막에 열쇠값을 제자리에 놓는 것도 이동 한 번으로 셉니다.
  • 퀵 정렬은 로무토(Lomuto) 분할을 씁니다. 호어(Hoare) 분할은 같은 입력에서도 교환 횟수가 다르게 나오니 다른 답과 견줄 때 확인하세요. 중앙값 피벗을 고르는 데 드는 비교는 세 번으로 셉니다.
  • 병합 정렬의 이동에는 여분 배열에서 원래 배열로 되돌려 놓는 것까지 포함합니다. 제자리에서 합치는 구현이나 배열을 번갈아 쓰는 구현은 이동 횟수가 더 적습니다.
  • 실제 실행 시간은 비교·교환 횟수만으로 정해지지 않습니다. 캐시 지역성, 분기 예측, 원소 하나의 크기가 크게 작용해 횟수가 더 많은 알고리즘이 더 빠른 일도 흔합니다.
  • 숫자는 40개까지 봅니다. 회전마다의 배열은 버블·선택·삽입에만 있습니다 — 병합·퀵·힙은 재귀나 부분 구간으로 움직여 «회전»이라는 단위가 없습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.