퀵 정렬(Quick sort) 알고리즘의 개념
- 퀵 정렬(Quick sort)은 일반적으로 사용되고 있는 아주 빠른 정렬 알고리즘
- '찰스 앤터니 리처드 호어(C. A. R. Hoare)가 개발한 정렬 알고리즘
- 불안정 정렬에 속하며, 원소들과의 비교만으로 정렬을 수행
- 분할 정복 알고리즘 중 하나
퀵 정렬(Quick sort) 알고리즘 세부 과정
- 먼저 하나의 요소를 선택한다. 이렇게 고른 요소를 피벗(pivot)이라고 한다.
- 피벗을 기준으로 피벗보다 작은 값을 피벗기준 왼쪽으로, 큰 값을 피벗기준 오른쪽으로 정렬한다.
- 피벗을 제외한 왼쪽 값들과 오른쪽 값들을 다시 정렬한다.
- 위처럼 나눈 값들의 길이가 1이 될 때까지 반복한다.
퀵 정렬(Quick sort) 알고리즘 예제
- 배열의 요소가 5, 7, 1, 4, 6, 2, 3, 9, 8 순으로 저장돼있고 오름차순을 기준으로 정렬할 때 예를 확인해보자
- 위처럼 left값이 right값보다 크면 반복문이 종료된다.
- 첫 번째 단계가 끝나고 구분한 기준으로부터 각각 나눠 left와 right, pivot을 두고 첫 번째와 같은 계산을 반복한다
- 분할 정복 단계가 나뉜 배열의 크기가 1일 때까지 진행한다.
[Java 코드]
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
31
32
33
34
35
36
37
38
|
public class QuickSort {
public static void swap(int[] arr, int pl, int pr) {
int temp = arr[pl];
arr[pl] = arr[pr];
arr[pr] = temp;
}
public static void quickSort(int[] arr, int left, int right) {
int pl = left;
int pr = right;
int pivot = arr[ (arr[left] + arr[right]) / 2];
do { //정복단계
while(arr[pl] < pivot) pl++;
while(arr[pr] > pivot) pr--;
if(pl <= pr) {
swap(arr, pl, pr);
pl++;
pr--;
}
}while(pl <= pr);
if(left < pr) quickSort(arr, left, pr);
if(pl < right) quickSort(arr, pl, right);
}
public static void main(String[] args) {
int[] arr = { 5, 7, 1, 4, 6, 2, 3, 9, 8 };
int N = arr.length;
quickSort(arr, 0, N-1);
for(int a : arr) {
System.out.print(a +" ");
}
}
}
|
cs |
[Python 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def quick_sort(arr):
if len(arr) < 2:
return arr
pivot = arr[0] # 파이썬에서는 맨 처음 값을 피봇으로 정해보겠다.
left = [i for i in arr[1:] if i <= pivot] # 피벗과 같은 값이 사라지는 것을 방지
right = [i for i in arr[1:] if i > pivot]
newarr = quick_sort(left) + [pivot] + quick_sort(right)
return newarr
arr = [5, 7, 1, 4, 6, 2, 3, 9, 8]
arr = quick_sort(arr)
print(arr)
|
cs |
반응형
'알고리즘 | 자료구조' 카테고리의 다른 글
[알고리즘] Union-Find 알고리즘 (Disjoint Set) (0) | 2020.09.06 |
---|---|
[알고리즘/정렬 알고리즘] 병합 정렬(Merge sort) Java, Python (0) | 2020.06.28 |
[알고리즘/정렬 알고리즘] 셸 정렬 (Shell sort) Java, Python (0) | 2020.06.28 |
[알고리즘/정렬 알고리즘] 삽입 정렬 (Insertion sort) Java, Python (2) | 2020.06.27 |
[알고리즘/정렬 알고리즘] 선택 정렬 (Selection sort) Java, Python (2) | 2020.06.26 |