IT&컴퓨터공학/자료구조&알고리즘
[12] 심화 정렬 ( SORT ) - Quick Sort
yan_z
2020. 6. 28. 17:25
분할 정복법(divide and conquer) : Merge Sort, Quick Sort
분할 : 해결하고자 하는 문제를 작은 크기의 동일한 문제들로 분할
정복 : 각각의 작은 문제를 순환적으로해결
Merge Sort 는 그냥 배열을 반씩 쪼개는데 반해, Quick Sort 는 Pivot 을 기준으로 사용해서 분할함.
아래의 코드는 Pivot 을 배열의 가운데 수로 정했을 때 퀵소트 예시
import java.util.Scanner;
// Quick Sort
public class sort_2 {
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] = scanner.nextInt();
arr =quickSort(arr, 0, n-1);
for(int i=0;i<n;i++) System.out.println(arr[i]);
}
static int[] swap(int[] arr, int start, int end) {
int temp =0;
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
return arr;
}
static int partition(int[] array, int start, int end) {
int pivot = array[(start + end) / 2]; // pivot을 가운데 값으로 설정
while (start <= end) {
while (array[start] < pivot) start++; // pivot 의 왼쪽에서는 pivot 보다 큰 값을 찾음
while (array[end] > pivot) end--; // pivot 의 오른쪽에서는 pivot 보다 작은 값을 찾음
if (start <= end) {
array = swap(array,start,end); // 두개의 값을 교환
}
}
return start;
}
static int[] quickSort(int[] array, int start, int end) {
int p = partition(array, start, end);
if (start < p - 1)
quickSort(array, start, p - 1);
if (p < end)
quickSort(array, p, end);
return array;
}
}
시간 복잡도
Worst : O($n^2$)
Best : O($nlogn$)
Average : O($nlogn$)