퀵 정렬이란?
피벗(pivot)을 사용한 정렬 알고리즘이며 피벗에 따라 시간복잡도가 달라질 수 있다. 병합 정렬과 같은 분할 정복 알고리즘.
많은 양의 데이터를 정렬하는데 유용.
시간복잡도
평균 | O(nlogn) |
최악 | O(n^2) |
동작방식
자바로 구현
public class Sort{
public static void main(String[] args){
int[] arr = {6,2,5,3,8,1,4,20,78};
int length = arr.length();
quickSort(arr, 0, length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int start, int end) {
int part2 = partition(arr, start, end); //part2 : 오른쪽 파티션의 시작점
//만약 start가 part2-1과 같으면 정렬할 필요가 없기때문에 if문에서 설정
if(start < part2 - 1){
quickSort(arr, start, part2-1);//end는 오른쪽 파티션의 시작점에서 왼쪽으로 한칸
}
//만약 part2의 시작점이 end와 같으면 정렬할 필요가 없기 때문에 if문에서 설정
if(part2 < end){
quickSort(arr, part2, end);
}
}
public static int partition(int[] arr, int start, int end){
int m = (start + end)/2;
int pivot = arr[m]; // 해당 파티션의 중간에 있는 값
//start와 end가 엇갈릴때까지 반복
while(start <= end){
// start가 피봇보다 작으면 start++ (피봇보다 큰 값이 나올때까지 반복)
while(arr[start] < pivot)start++;
//end가 피봇보다 크면 end-- (피봇보다 작은 값이 나올때까지 반복)
while(arr[end] > pivot)end--;
//start와 end가 서로 엇갈리지 않았으면 swap
if(start <= end){
swap(arr,start,end);
start++;
end--;
}
}
return start; //새로 나뉠 파티션의 첫번째 인덱스를 반환 (part2)
}
public static void swap(int[] arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
참고
https://innovation123.tistory.com/84
[JAVA] 퀵 정렬 (Quick Sort)
퀵 정렬 (Quick sort) 퀵 정렬은 기준값(pivot)을 선정해 해당 값보다 작은 데이터와 큰 데이터로 분류하는 것을 반복해 정렬하는 알고리즘이다. 시간복잡도가 비교적 빠르기 때문에 코딩테스트에서
innovation123.tistory.com
[ 알고리즘 ] 너비 우선 탐색 (BFS) (0) | 2024.04.08 |
---|---|
[ 알고리즘 ] 버블정렬 (Bubble Sort) (0) | 2024.03.23 |
[ 알고리즘 ] 깊이 우선 탐색 (DFS) (0) | 2024.03.20 |
[ 알고리즘 ] 투 포인터 (Two Pointer) (0) | 2024.03.10 |
[ 알고리즘 ] 구간 합 (Prefix Sum) (0) | 2024.03.09 |