Development/알고리즘
누구나 자료구조와 알고리즘 - (10) 퀵 정렬(Quicksort)
레오나르도 다빈츠
2023. 9. 29. 15:53
퀵 정렬(Quicksort)
버블 정렬, 선택 정렬, 삽입 정렬같은 알고리즘이 있지만 대부분의 언어에서는 퀵 정렬(Quicksort)를 선택한다.
퀵 정렬은 매우 빠른 정렬 알고리즘으로 평균 시나리오에서 효율적이다. 최악의 시나리오에서는 삽입 정렬, 선택 정렬과 성능이 유사하지만 대부분의 경우의 평균 시나리오에서는 훨씬 빠르다.
1.1. 퀵 정렬의 분할
퀵 정렬은 분할이라는 개념에 기반한다.
배열을 분할 한다는 것은 배열로부터 임의의 수인 피벗(pivot)을 가져와 피벗보다 작은 모든 수는 피벗의 왼쪽에, 피벗보다 큰 모든 수는 피벗의 오른쪽에 둔다.
1. 여기서 3을 피벗으로 지정하고 두 개의 포인터를 사용한다.
0 pointer1 |
5 |
2 |
1 |
6 pointer2 |
3 pivot |
2. 왼쪽 포인터를 한 셀씩 계속 오른쪽으로 옮기면서 피벗보다 크거나 같은 값에 도달하면 멈춘다.
0 |
5 pointer1 |
2 |
1 |
6 pointer2 |
3 pivot |
3. 오른쪽 포인터를 한 셀씩 계속 왼쪽으로 옮기면서 피벗보다 작거나 같은 값에 도달하면 멈춘다.
0 |
5 pointer1 |
2 |
1 pointer2 |
6 |
3 pivot |
4. 둘을 교환한다.
0 |
1 |
2 |
5 |
6 |
3 pivot |
5. 교환하다가 왼쪽 포인터가 오른쪽 포인터에 도달하면 이동을 중지하고 왼쪽값과 피벗을 교환한다.
0 |
1 |
2 |
3 pivot |
6 |
5 |
분할이 끝나면 피벗 왼쪽에 있는 값은 모두 피벗보다 작고 피벗 오른쪽에 있는 값은 모두 피벗보다 크다고 확신할 수 있다.
1.2. 퀵 정렬
- 퀵 정렬은 분할과 재귀로 이뤄진다. 피벗의 왼쪽과 오른쪽에 있는 하위 배열을 각각 또 다른 배열로 보고 1단계와 2단계를 재귀적으로 반복하는 것이다.
- 퀵 정렬은 새로운 빅 오 카테고리로 O(NlogN) 알고리즘이다. (원소가 N개 일 때 원소가 2배로 늘어날 때 마다 필요한 단계수가 한 단계씩 늘어나기 때문에 N x logN이다.) 이 알고리즘은 가장 빠른 정렬 알고리즘이다.
- 많은 알고리즘에서 정렬을 더 큰 프로세스의 일부로 사용한다. 그러면 최소 O(NlogN) 알고리즘까지 도달할 수 있다.
출처
제이 웹그로우, 누구나 자료구조와 알고리즘 (길벗, 2021)
개인적으로 공부한 내용을 정리하는 블로그로
잘못된 개념을 게시하지않도록 주의하고 있으나 오류가 있을 수 있습니다.