Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- DB생성
- pagination
- frontend
- intellij
- MYSQL에러
- springMVC
- appleM1
- offset
- restful api
- gradle
- VUE
- spring
- CloutNative
- K8S
- 이클립스
- Lombok
- MySQL시작하기
- wappalyzer
- String
- SQL
- 스프링에러
- windows10
- Java
- 우분투에war배포
- Seek_Keyset
- NullPointerException
- minikube
- SpringBoot
- MySQL
- Postman
Archives
- Today
- Total
미운 오리 새끼의 우아한 개발자되기
[정렬 #3] 퀵 정렬(Quick Sort) w.Java 본문
퀵 정렬은 pivot을 기준으로 partitioning을 하여 다른 원소와의 비교를 통해 정렬을 수행하는 비교 정렬에 속하는 정렬이다.
1. 리스트 가운데서 하나의 원소를 고른다. 이렇게 고른 원소를 pivot이라고 한다.
2. pivot 앞에는 pivot 보다 값이 작은 모든 원소들이 오고, pivot 뒤에는 pivot 보다 값이 큰 모든 원소들이 오도록 pivot을 기준으로 리스트를 둘로 나눈다. 이렇게 리스트를 둘로 나누는 것을 분할이라고 한다. 분할을 마친 뒤에 pivot은 더이상 움직이지 않는다.
3. 분할된 두 개의 작은 리스트에 대해 재귀적으로 이 과정을 반복한다. 재귀는 리스트의 크기가 0이나 1이 될 때까지 반복된다.
특징 및 장점
- 분할 정복 알고리즘이다.
- 비교 정렬이다.
- in place 정렬이다.
- 잘 구현되면(nlogn), merge sort 보다 빠르다.
단점
- 불안정 정렬이다. (경우에 따라 시간 복잡도가 크게 차이남)
- 최악의 경우 n2의 시간이 걸린다.
- pivot에 따라 성능차이가 심하다.
Java로 구현
public void quickSort(int[] arr, int left, int right){
int i, j, pivot, tmp = 0;
if(left < right){
i = left;
j = right;
// 1. divide
while(i < j){
while(arr[j] > pivot) j--;
while((i < j) && (arr[i] < pivot)) i++;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
// 2. sort
quickSort(arr, left, i-1);
quickSort(arr, i+1, right);
}
}
시간 복잡도
최악: n^2 -> pivot이 partition 내에서 가장 크거나 가장 작은 값이 되는 경우
평균: nlogn
최선: nlogn
Reference
'Algorithm' 카테고리의 다른 글
[알고리즘] 유클리드 호제법 in Java (최대공약수, 최소공배수) (0) | 2022.02.25 |
---|---|
[정렬 #2] 합병 정렬(Merge Sort) w.Java (0) | 2022.01.25 |
[정렬 #1] 삽입 정렬(Insertion Sort) w. Java (0) | 2022.01.25 |