Skip to content

Commit 2a7d944

Browse files
authored
Create QuickSort.md
1 parent 8bd2758 commit 2a7d944

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

QuickSort.md

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Quick Sort
2+
퀵 정렬은 **분할 정복(divide and conquer)** 방법으로 리스트를 정렬한다. </br>
3+
다른 원소와의 비교만으로 정렬을 수행하는 **비교 정렬** 이며, **불안정 정렬** 에 속한다. </br>
4+
5+
## Algorithm
6+
퀵 정렬은 임의의 pivot 값을 기준으로 pivot 의 좌측에는 pivot 보다 작은 값을 두고 우측에는 pivot 보다 큰 값을 두는 것을 목적으로 하는데,
7+
이 행동을 pivot 을 기준으로 좌우로 이분화된 리스트들에 대해 재귀적으로 반복하며 정렬을 수행한다. </br>
8+
9+
1. 리스트 가운데서 하나의 원소를 고른다. -> **pivot**
10+
2. (**divide**) pivot 앞에는 pivot 보다 작은 원소들이 오고, pivot 뒤에는 pivot 보다 값이 큰 모든 원소들이 오도록 pivot 을 기준으로 리스트를 나눈다.
11+
3. 분할된 두 개의 작은 리스트들에 대해 재귀적으로 1-2 과정을 반복한다. 재귀는 리스트의 크기가 0 이나 1 이 될때까지 반복한다.
12+
13+
> 재귀 호출이 한 번 진행될 때마다 하나의 원소는 최종적으로 위치가 정해지므로, 알고리즘이 반드시 끝난다는 것을 보장할 수 있다.
14+
15+
### Time Complexity
16+
퀵 정렬은 *O(n log n)* 의 시간복잡도를 가진다.
17+
> 퀵정렬의 내부 루프는 지역성의 원리에 따라 CPU 캐시 히트율이 높아지도록 설계 되어있기 때문에 일반적으로 다른 *O(n log n)* 알고리즘에 비해 훨씬 빠르게 동작한다.
18+
19+
## Code
20+
21+
### Java
22+
````java
23+
public void partiion(int[] arr, int l, int r) {
24+
// pivot 을 결정하는 기준은 달라질 수 있음
25+
int pivot = arr[(l + r) / 2];
26+
27+
while (left < right) {
28+
while ((arr[left] < pivot) && (left < right))
29+
left++;
30+
while ((arr[right] > pivot) && (left < right))
31+
right--;
32+
33+
if (left < right) {
34+
int temp = arr[left];
35+
arr[left] = arr[right];
36+
arr[right] = temp;
37+
}
38+
}
39+
40+
return left;
41+
}
42+
43+
public void quickSort(int[] arr, int l, int r) {
44+
if (l < r) {
45+
int idx = partition(arr, left, right);
46+
quickSort(arr, left, idx - 1);
47+
quickSort(arr, idx + 1, right);
48+
}
49+
}
50+
````
51+
> java 에서는 `java.util.Arrays` 로 primitive 타입을 정렬하고자 할 때, quick sort 를 사용한다.

0 commit comments

Comments
 (0)