프로그래밍 노트/알고리즘

[JAVA] 퀵정렬(Quick Sort)

깡냉쓰 2018. 4. 18. 21:09
728x90
반응형

퀵정렬(Quick Sort)

정렬 알고리즘 중 가장 효율적이고 빠른방식 입니다.

동작방식(아이디어)은 아래와 같습니다.

1. 기준점이 되는 pivot을 구한다.

2. pivot을 기준으로 left(pviot보다 작은 값) 리스트와 right(pivot 보다 큰 값)리스트를 구합니다.

3. 나눠진 left와 right 리스트를 정렬이될 때까지 분할처리 합니다. => 재귀사용(자기자신을 호출)

(설명 및 그림참고 : 네이버 지식백과(퀵정렬))


퀵정렬은 버블 정렬이나 삽입 정렬보다 훨씬 더 효율적인 성능을 발휘합니다. 퀵정렬의 평균 시간복잡도는 O(nlogn)이며, 최악의 경우에는 여전히 O(n^2)의 시간복잡도를 갖습니다. 이 성능차이는 pivot의 선택에 따라 좌우되게 되는데, 아래코드와 같이 가장앞에 있는 수를 pivot으로 잡을 경우, 리스트가 역순으로 정렬되어 있다면 최악의 시간복잡도를 갖게됩니다. pivot은 리스트의 중간숫자로 잡는 것이 가장 효율적인 방법입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public List<Integer> quickSort(List<Integer> numbers){
        if(numbers.size() < 2)
            return numbers;
        
        final Integer pivot = numbers.get(0);
        final List<Integer> lower = new ArrayList<>();
        final List<Integer> higher = new ArrayList<>();
        
        for(int i=1; i<numbers.size(); i++) {
            if(numbers.get(i) < pivot) {
                lower.add(numbers.get(i));
            }else {
                higher.add(numbers.get(i));
            }
        }
        
        final List<Integer> sorted = quickSort(lower);
        sorted.add(pivot);
        sorted.addAll(quickSort(higher));
        
        return sorted;
    }
cs



728x90
반응형