Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- aws
- 스프링
- ES6
- 메서드
- SpringBoot
- 맥길대학교
- jsp
- lightsail
- vue.js
- 에러
- Keycloak 17.0.1
- json
- keycloak
- spring
- java
- vue
- Flutter
- 글로벌
- REACT
- 알고리즘
- jQuery
- nginx
- 현장학습
- 인텔리제이
- 자바스크립트
- gradle
- JavaScript
- Docker
- jpa
- arraylist
Archives
- Today
- Total
korean IT student
4. 퀵 정렬(Quick Sort) 본문
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
39
40
41
42
43
44
45
46
47
48
49
50
|
public class Main {
public static void main(String[] args) {
int[] arr = { 6, 5, 9, 8, 7, 4 };
quickSort(arr, 0, arr.length - 1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
private static void quickSort(int[] arr, int start, int end) {
int left = start; // 첫 번째 원소
int right = end; // 마지막 값
// pivot을 중앙 값으로 셋팅
int pivot = arr[(left + right) / 2];
do {
while (arr[left] < pivot) { // pivot 보다 큰 값을 만나기 전까지 반복
left++;
}
while (arr[right] > pivot) { // pivot 보다 작은 값을 만나기 전까지 반복
right--;
}
if (left <= right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
} while (left <= right); // 엇 갈릴 때 까지 반복
// 재귀 함수
if (start < right) {
quickSort(arr, start, right);
}
if (end > left) {
quickSort(arr, left, end);
}
}
}
|
cs |
퀵 정렬은 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬에 속한다.
퀵 정렬은 n개의 데이터를 정렬할 때, 최악의 경우에는 O(n2)번의 비교를 수행하고, 평균적으로 O(n log n)번의 비교를 수행한다. 최악의 경우는 이미 정렬되어 있는 경우이다. 이 경우는 삽입 정렬이 빠를 수 있다.
퀵 정렬은 분할 정복 방법을 통해 리스트를 정렬한다.
- 리스트 가운데서 하나의 원소를 고른다. 이렇게 고른 원소를 피벗이라고 한다.
- 피벗 앞에는 피벗보다 값이 작은 모든 원소들이 오고, 피벗 뒤에는 피벗보다 값이 큰 모든 원소들이 오도록 피벗을 기준으로 리스트를 둘로 나눈다. 이렇게 리스트를 둘로 나누는 것을 분할이라고 한다. 분할을 마친 뒤에 피벗은 더 이상 움직이지 않는다.
- 분할된 두 개의 작은 리스트에 대해 재귀적으로 이 과정을 반복한다. 재귀는 리스트의 크기가 0이나 1이 될 때까지 반복된다.
재귀 호출이 한번 진행될 때마다 최소한 하나의 원소는 최종적으로 위치가 정해지므로, 이 알고리즘은 반드시 끝난다는 것을 보장할 수 있다.
{ 6, 5, 9, 8, 7, 4 } -> 먼저 pivot 위치를 정한다.
{ 6, 5, 9, 8, 7, 4 } -> 9보다 큰 숫자를 왼쪽부터 찾고, 9보다 작은 숫자를 오른쪽부터 찾는다.
{ 6, 5, 9, 8, 7, 4 } -> 9보다 큰 숫자를 찾지 못해서 9로 돌아오고 작은 숫자는 4입니다. 둘이 교환합니다.
{ 6, 5, 4, 8, 7, 9 } -> 4보다 큰 숫자를 왼쪽에서 찾고 4보다 큰수를 오른쪽부터 찾는다.
{ 6, 5, 4, 8, 7, 9 } -> 4보다 큰 숫자는 6이고 작은 숫자는 찾지못하여 4입니다. 둘이 교환합니다.
{ 4, 5, 6, 8, 7, 9 } -> 8보다 큰 숫자를 왼쪽부터 찾고, 8보다 작은 숫자를 오른쪽부터 찾는다.
{ 4, 5, 6, 8, 7, 9 } -> 8보다 큰 숫자를 찾지 못해서 8로 돌아오고 작은 숫자는 7입니다. 둘이 교환합니다.
{ 4, 5, 6, 7, 8, 9 } -> 정렬
'알고리즘' 카테고리의 다른 글
너비 우선 탐색(Breath First Search) (0) | 2020.08.03 |
---|---|
5. 병합 정렬(Merge Sort) (0) | 2020.07.26 |
3. 삽입 정렬(Insertion Sort) (0) | 2020.07.22 |
2. 버블정렬(Bubble Sort) (0) | 2020.07.22 |
1. 선택 정렬(Selection Sort) (0) | 2020.07.22 |
Comments