퀵 정렬 예제 - 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)만 정렬을 수행한다.
손으로 풀어보기
중간 위치를
pivot으로 설정한 다음 맨 앞에 있는 값과swap한다.pivot을 맨 앞으로 옮기는 이유는i,j이동을 편하게 하기 위함이다. 이어서i와j를pivot을 제외한 그룹에서 왼쪽, 오른쪽 끝으로 정한다.

i는 1번 index(start),j는 마지막 index(end)에 위치한다.
우선
j를 이동한다.j가pivot보다 크면j--연산을 반복한다.j를 이동한 후에는i가pivot보다 작으면서i보다j가 크면i++연산을 반복한다.

pivot을 두 집합을 나눠 주는 위치, 즉i와j가 만난 위치와swap한다.

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

슈도코드
코드 구현 - 파이썬
코드 구현 - 자바
Last updated