퀵 정렬 예제 - 1

문제 분석

  • 주어진 수를 오름차순 정렬하고 k번째 수를 출력한다.

  • N이 최대 5,000,000 이기 때문에 sort() 내장 함수를 사용해도 되지만, 퀵 정렬을 구현해 본다.

    • 퀵 정렬은 pivot의 선택에 따라 최악의 시간 복잡도가 n^2이므로 이 문제에서는 병합 정렬(nlogn) 등을 사용하는 것이 더 안전하다.

pivot을 정하는 방법

  • pivot == k : k번째 수를 찾은 것이므로 알고리즘을 종료한다.

  • pivot > k : pivot의 왼쪽 부분에 k가 있으므로 왼쪽(start ~ pivot - 1)만 정렬을 수행한다.

  • pivot < k : pivot의 오른쪽 부분에 k가 있으므로 오른쪽(pivot + 1 ~ end)만 정렬을 수행한다.

손으로 풀어보기

  1. 중간 위치를 pivot으로 설정한 다음 맨 앞에 있는 값과 swap한다. pivot을 맨 앞으로 옮기는 이유는 i, j이동을 편하게 하기 위함이다. 이어서 ijpivot을 제외한 그룹에서 왼쪽, 오른쪽 끝으로 정한다.

img_1.png
  • i는 1번 index(start), j는 마지막 index(end)에 위치한다.

  1. 우선 j를 이동한다. jpivot보다 크면 j-- 연산을 반복한다. j를 이동한 후에는 ipivot보다 작으면서 i보다 j가 크면 i++ 연산을 반복한다.

img_2.png
  1. pivot을 두 집합을 나눠 주는 위치, 즉 ij가 만난 위치와 swap한다.

img_3.png
  1. K는 2이므로 이제 더 이상 정렬하지 않고 출력한다.

img_4.png

슈도코드

코드 구현 - 파이썬

코드 구현 - 자바

Last updated