프로그래밍/Algorithm

퀵 정렬(Quicksort)

Baesj 2021. 8. 15. 17:50

퀵 정렬은 분할 정복 전략을 사용한다

java에서 Arrays.sort는 DualPivotQuicksort를 사용한다.

최악의 경우 O(n^2)이고 평균적으로 O(n log n)이다

 

특정 값을 기준으로 그 값보다 작으면 앞으로 크면 뒤로 옮긴다

정렬이 될 때까지 반복한다

 

잘 구현하지 않으면 효율이 좋지 않다

 

import java.io.*;
import java.util.ArrayList;

public class QuickSort {
    //빅오 표기법 = 평균 O(nlogn) 최악 O(n^2)
    //퀵 정렬이 병합 정렬보다 빠른 이유는 상수 때문
    //백준 알고리즘 2751문제 - 퀵정렬로 안됨 병합정렬을 사용해야함 - 잘구현하면 됨
    //잘구현하지 않으면 효율이 안좋다
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());
        ArrayList<Integer> box = new ArrayList<>(n);
        for(int i = 0;i<n;i++){
            int x = Integer.parseInt(br.readLine());
            box.add(x);
        }
        ArrayList<Integer> output;
        output = quick(box);
        for(int i = 0;i<output.size();i++){
            bw.write(output.get(i)+"\n");
        }
        bw.flush();
        bw.close();

    }
    public static ArrayList<Integer> quick(ArrayList<Integer> arr){
        ArrayList<Integer> join = new ArrayList<>();
        if(arr.size()>0){
            int a = arr.get(0);
            ArrayList<Integer> low = new ArrayList<>();
            ArrayList<Integer> high = new ArrayList<>();
            for(int i = 1;i<arr.size();i++){
                if(arr.get(i)<a){
                    low.add(arr.get(i));
                }else{
                    high.add(arr.get(i));
                }
            }
            join.addAll(quick(low));
            join.add(a);
            join.addAll(quick(high));
        }
        return join;
    }
}

 

'프로그래밍 > Algorithm' 카테고리의 다른 글

다익스트라 알고리즘(Dijkstra Algorithm)  (0) 2021.08.29
너비 우선 탐색(BFS : Breadth-First Search)  (0) 2021.08.18
재귀(Recursion)  (0) 2021.08.11
선택 정렬(SelectionSort)  (0) 2021.08.04
이진 탐색(Binary search)  (0) 2021.06.29