https://jjunsu.tistory.com/187
[알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 중앙으로 잡았을 때
퀵 정렬 퀵 정렬은 합병 정렬과 마찬가지로 분할 정복을 알고리즘이다. 가장 훌륭한 알고리즘 중 하나로 평균적으로 매우 빠른 수행 속도를 자랑한다. 시간복잡도는 평균적으로 O(nlogn)이고, 추...
jjunsu.tistory.com
퀵 정렬 왼쪽 피벗
저번에는 피벗을 중앙으로 잡았을 때를 알아봤었다.
이번에는 피벗을 맨 왼쪽으로 잡았을 때를 알아보도록 하자.
![[알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗 [알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
맨 앞의 원소를 pivot으로 하고, left를 pivot의 한칸 뒤 원소로 잡는다. 또한 right는 맨 뒤의 원소로 잡는다.
이제 left가 pivot보다 클 때까지 증가시키고, right는 pivot보다 작아질 때까지 감소시킨다.
![[알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗 [알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
6은 pivot보다 크므로 left가 멈춘다. 또한 2는 pivot보다 작으므로 right가 멈춘다.
swap을 할 때 두가지 경우가 있는데,
1. left가 right보다 크거나 같을 때 -> swap(arr, right, pivot)
2. left가 right보다 작을 때 -> swap(arr, left, right)
이번엔 left < right이므로 swap(arr, left, right)이다.
swap을 한 후 이어서 left와 right를 탐색한다.
![[알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗 [알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
이번 경우는 left > right이다.
따라서 swap(arr, right, pivot)을 한다.
![[알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗 [알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
right가 left보다 커졌기 때문에 반복문을 종료하고 right를 기준으로 start ~ right-1, right+1 ~ end의 두 배열로 분할한다.
![[알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗 [알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
두 배열에도 똑같이 원래 배열에서 했던 방식을 돌려준다.
이 때 오른쪽 배열인 6, 7을 보면 right가 더 작은 값을 찾기 위해 왼쪽으로 가는데, 끝에 마주치게 된다.
이 때 swap(arr, right, pivot)이 일어나는데, 배열에 변화가 없다.
따라서 왼쪽 배열만을 보면 된다.
![[알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗 [알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
이번에도 left > right가 되었으므로, start ~ right-1, right+1 ~ end의 두 배열로 분할시킨다.
이 때 {2, 1}, {3}, {4}의 배열로 나눠지게 된다.
3, 4는 배열의 크기가 1이므로 신경쓰지 않아도 된다.
{2, 1} 배열을 보자.
![[알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗 [알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗](https://blog.kakaocdn.net/dna/Wd9Cy/btry8yqe2Td/AAAAAAAAAAAAAAAAAAAAAHWyhjjUereI_CW-ChvvVIjTxkzTeiajoY_Ziky8S3W8/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1756652399&allow_ip=&allow_referer=&signature=LDJXd1%2FgQerb%2BH%2FReU3fCjPJ4YM%3D)
위는 left와 right가 같은 위치에 있다.
그렇다면 swap(arr, right, pivot)이 일어난다.
![[알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗 [알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 첫 값으로 잡았을 때 - undefined - 퀵 정렬 왼쪽 피벗](https://blog.kakaocdn.net/dna/bKjBwN/btrzfBSZYkZ/AAAAAAAAAAAAAAAAAAAAAEZXDOcTKUP24NXxdztRhaP6CBpymFoJV54hPzJmzVbW/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1756652399&allow_ip=&allow_referer=&signature=VDPnb8mPNozR4IeYFu8fiQ1UaZs%3D)
결론적으로 정렬된 배열 형태가 된다.
퀵 정렬 왼쪽 피벗 코드
public class quickSortLeftPivot {
public static void main(String[] args) {
int[] arr = {1, 5, 6, 4, 9, 3, 2, 7, 8};
System.out.println("정렬 전: ");
for(int i=0; i<arr.length; i++) System.out.print(arr[i] + " ");
System.out.println();
quickSort(arr, 0, arr.length-1);
System.out.println("정렬 후: ");
for(int i=0; i<arr.length; i++) System.out.print(arr[i] + " ");
System.out.println();
}
public static void quickSort(int[] arr, int start, int end) {
if(start >= end) return;
int pivot = start;
int left = start + 1;
int right = end;
while(left <= right) {
while(left <= end && arr[left] < arr[pivot]) left++;
while(right > start && arr[right] >= arr[pivot]) right--;
if(left >= right) swap(arr, right, pivot);
else swap(arr, left, right);
}
quickSort(arr, start, right - 1);
quickSort(arr, right + 1, end);
}
public static void swap(int[] arr, int idx1, int idx2) {
int temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
}
}
'Algorithm' 카테고리의 다른 글
[알고리즘] 퀵 정렬(Quick Sort) - 랜덤 피벗 (0) | 2022.04.14 |
---|---|
[알고리즘] 퀵 정렬(Quick Sort) - 피벗을 맨 끝 값으로 잡았을 때 (0) | 2022.04.13 |
[알고리즘] 퀵 정렬(Quick Sort) - pivot(피벗)을 중앙으로 잡았을 때 (2) | 2022.04.10 |
[알고리즘] 마스터 정리(도사 정리) (0) | 2022.04.09 |
[알고리즘] 분할 정복(Divide & Conquer) (0) | 2022.04.06 |
댓글