티스토리 뷰
Quick Sort (퀵 정렬)
기준값(pivot)을 잡고, pivot보다 작은수는 좌partition으로 큰수는 우partition으로 보낸다.
다시 좌/우partition에서 각각 pivot을 설정하고 좌/우partition으로 나눈다.
이러한 과정 반복
- divide & conquer
- pivot을 설정하는 방법이 다양하고, 이에 따라 성능이 결정된다. (pivot을 좌우끝값 또는 중앙값으로 등등..)
- 평균 시간 복잡도 : O(nlog2n)
- 최악 시간 복잡도 : O(n2)
- 구현방법이 제각각, 다양하다
import java.lang.Math;
import java.util.Scanner;;
public class Test {
public static void printArray(int[] arr) {
for(int i=0; i<arr.length; i++) {
System.out.printf("%2d ", arr[i]);
}
System.out.println();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for(int i=0; i<n; i++) {
arr[i] = (int) (Math.random() * 100);
}
System.out.print("before Sort: ");
printArray(arr);
quickSort(arr, 0, n-1);
System.out.print("after Sort: ");
printArray(arr);
}
public static void quickSort(int[] arr, int left, int right){
int L = left;
int R = right;
int pivot = arr[(left+right)/2];
do {
while(arr[L] < pivot) L++;
while(arr[R] > pivot) R--;
if(L <= R){
int temp = arr[L];
arr[L] = arr[R];
arr[R] = temp;
L++;
R--;
printArray(arr);
}
} while (L <= R);
if(left < R) quickSort(arr, left, R);
if(right > L) quickSort(arr, L, right);
}
}
public static void quickSort(int arr[], int left, int right) {
int pivot, left_temp, right_temp;
left_temp = left;
right_temp = right;
pivot = arr[left];
while (left < right) {
while (arr[right] >= pivot && (left < right)) {
right--;
}
if (left != right) {
arr[left] = arr[right];
}
while (arr[left] <= pivot && (left < right)) {
left++;
}
if (left != right) {
arr[right] = arr[left];
right--;
}
}
arr[left] = pivot;
pivot = left;
left = left_temp;
right = right_temp;
printArray(arr);
if (left < pivot) quickSort(arr, left, pivot - 1);
if (right > pivot) quickSort(arr, pivot + 1, right);
}
Merge Sort (병합 정렬)
Divide & Conquer 개념을 이용.
분할후 합치며 정렬시킨다.
(합칠땐 정렬된 상태이므로 두 요소의 맨앞 자리 값들을 비교하면됨)
=> Two Pointer 알고리즘으로 병합
- 시간 복잡도 : O(nlog2n)
public static void mergeSort(int arr[], int left, int right) {
if (left>=right) return;
int M = (left+right)/2;
mergeSort(arr, left, M);
mergeSort(arr, M+1, right);
ArrayList<Integer> tmp = new ArrayList<>();
for(int L=left, R=M+1 ; L < M+1 || R < right+1 ; ) {
if( (L < M+1 && R < right+1 && arr[L]<arr[R]) || R == right+1 )
tmp.add(arr[L++]);
else
tmp.add(arr[R++]);
}
for(int i=left ; i<=right ; i++) {
arr[i] = tmp.get(i-left);
}
printArray(arr);
}
'Algorithm' 카테고리의 다른 글
알고리즘) Heap/Tree Sort (힙/트리 정렬) (0) | 2019.09.12 |
---|---|
알고리즘) Shell/Radix Sort (셸/기수 정렬) (0) | 2019.09.12 |
알고리즘) Selection/Insertion/Bubble Sort (선택/삽입/버블 정렬) (0) | 2019.09.12 |
알고리즘) Sieve of of Eratosthenes (에라토스테네스의 체) (0) | 2019.09.12 |
알고리즘) Linear/Binary Search (선형/이진 검색) (0) | 2019.09.12 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- git
- mysql
- dfs
- queue
- 회고
- Vo
- sort
- OneToMany
- 프로그래머스
- 리버싱
- Stack
- bfs
- socket
- FRAGMENT
- 우아한 테크코스
- Java
- C
- JPA
- javascript
- webhacking.kr
- Data Structure
- brute-force
- reversing
- graph
- Algorithm
- Android Studio
- 해외여행
- Android
- 웹해킹
- 개발자
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
글 보관함