정렬 알고리즘
1. Bubble Sort(거품 정렬)
2. Selection Sort(선택 정렬)
3. Insertion Sort(삽입 정렬)
4. Quick Sort(퀵 정렬) ⇠
5. Merge Sort(병합 정렬)
6. Heap Sort(힙 정렬)
7. Radix Sort(기수 정렬)
8. Counting Sort(계수 정렬)
O(N^2)
번의 비교를 수행하고, 평균적으로 O(NlogN)
번의 비교를 수행한다.O(NlogN)
알고리즘에 비해 훨씬 빠르게 동작한다.Arrays.sort()
처럼 프로그래밍 언어 차원에서 기본적으로 지원되는 내장 정렬 함수는 대부분은 퀵 정렬을 기본으로 한다.public class Quick {
public static void quickSort(int[] arr) {
sort(arr, 0, arr.length - 1);
}
public static void sort(int[] arr, int low, int high) {
if (low >= high) return;
int mid = partition(arr, low, high);
sort(arr, low, mid - 1);
sort(arr, mid, high);
}
// 1. 정렬 범위를 인자로 받는다.
// 2. 좌우측의 값들을 정렬하고 분할 기준점의 인덱스를 리턴한다.
private static int partition(int[] arr, int low, int high) {
// 리스트의 정 가운데 값을 pivot으로 지정
int pivot = arr[(low+high)/2];
while (low <= high) {
while (arr[low] < pivot) low++; //pivot값 보다 크지만 좌측에 있는 값을 찾기 위해
while (arr[high] > pivot) high--; //pivot값 보다 작지만 우측에 있는 값을 찾기 위해
// 두 인덱스가 아직 서로 교차해서 지나치지 않았다면
// 시작 인덱스(low)가 가리키는 값과 끝 인덱스(high)가 가리키는 값을 교대(swap) 시킨다.
// (∵ 잘못된 위치에 있는 두 값의 위치를 바꾸기 위해서)
if (low <= high) {
swap(arr, low, high);
low++;
high--;
}
}
return low;
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
O(N)
이다. 입력 배열이 차지하는 메모리만을 사용하는 in-place sorting 방식으로 구현을 사용할 경우, O(logN)
의 공간 복잡도를 가진 코드의 구현이 가능하다.O(NlogN)
의 시간복잡도를 가진다.O(N)
의 시간이 걸리게 된다. 또 계속해서 pivot을 중위값으로 고르게 되면 데이터는 절반으로 쪼개지며 배열의 길이가 1이 될 때까지 logN번 분할을 하게 된다. 그래서 총 O(NlogN)
의 시간복잡도를 가지게 된다.O(N^2)
의 시간 복잡도를 보이게 된다.