파티셔닝을 이용한 정렬방법
① 기준값을 정한다.
② 첫번째부터 차례로 비교해나가면서
기준값보다 작으면 왼쪽 그룹의 끝자리+1과 위치를 바꾼다.
퀵 정렬의 수도코드
시간복잡도
Balanced Partitioning : 파티셔닝의 크기가 n/2로 줄어드는 경우
=> 높이 logN * 각 층별 N번의 연산을 수행
=> O(NlogN)
UnBalanced Partitioning : 파티셔닝의 크기가 1과 n-1개로 줄어드는 경우
=> 높이 N-1 * 각 층별 N-1번의 연산을 수행
=> O(N²)
* Unbalanced Partitioning(최악의 경우)를 피하기 위해 파티셔닝의 크기를 랜덤하게 가져가는 Randomized QuickSort가 등장함.
구현 JAVA
package algorithm;
import java.util.Arrays;
public class QuickSort {
static int[] arr;
static int[] tmp;
public void quickSort(int start, int end) {
if(start<end) {
int mid = partition(start, end);
quickSort(start, mid-1);
quickSort(mid+1, end);
}
}
private int partition(int start, int end) {
int pivot = arr[end]; //파티션 비교 기준 -> 가장 끝 값
/*하나씩 돌면서 pivot과 비교 > pivot보다 작으면 위치 바꾸기 */
for(int i = start; i<end; i++) {
if(arr[i]<pivot) {
swap(i, start);
start++;
}
}
/*마지막 위치를 파티션 기준 위치(가운데)로 이동함.
start값이 계속 증가했으므로 pivot보다 작은 값의 마지막 위치임*/
swap(start,end);
return start;
}
public void swap(int a, int b) {
int tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}
public static void main(String[] args) {
arr = new int[] {3, 5, 1, 6, 9, 2, 4};
tmp = new int[arr.length];
QuickSort f= new QuickSort();
f.quickSort(0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
}
출처
'알고리즘 > 알고리즘' 카테고리의 다른 글
선형시간 정렬 (0) | 2021.10.05 |
---|---|
힙 정렬 Heap Sort (0) | 2021.09.21 |
탐욕 알고리즘 Greedy Algorithm (0) | 2021.09.20 |
플로이드-와샬 알고리즘 Floyd-Warshall Algorithm (0) | 2021.09.20 |
벨만-포드 알고리즘 Bellman Ford's Algorithm (0) | 2021.09.20 |