ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [정렬] 퀵정렬
    CS/알고리즘 2021. 8. 28. 17:10

    퀵정렬 (Quick Sort)

    • 매우 빠른 수행속도를 자랑하는 정렬방법, 분할 정복 알고리즘에 해당
    • 분할 정복(divide and conquer) 방법 : 문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음, 결과를 합쳐 원래의 문제를 해결하는 전략.

     

    • 과정
    1. 배열 내에서 하나의 요소(피벗(pivot))를 선택한다.
    2. 피벗을 기준으로 피벗보다 작은 요소는 왼쪽, 큰 요소는 오른쪽으로 분류한다. (Divide)
    3. 왼쪽, 오른쪽 배열도 피벗을 선택한 후 왼쪽/오른쪽 배열로 분류한다. (재귀)
    4. 배열의 크기가 0 혹은 1이 될 때까지 반복한다. (Conquer)
    5. 모든 정렬된 배열을 합친다. (Combine)
    • 구현
    public class Main {
    	
    	public static void quickSort(int[] arr) {
            sort(arr, 0, arr.length - 1);
        }
    
        private static void sort(int[] arr, int low, int high) {
            if (low >= high) return;
    
            int mid = partition(arr, low, high);
            sort(arr, low, mid - 1);
            sort(arr, mid, high);
        }
    
        private static int partition(int[] arr, int low, int high) {
            int pivot = arr[(low + high) / 2];
            while (low <= high) {
                while (arr[low] < pivot) low++;
                while (arr[high] > pivot) high--;
                if (low <= high) {
                    swap(arr, low, high);
                    low++;
                    high--;
                }
            }
            return low;
        }
    
        private static void swap(int[] arr, int i, int j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
        
    
    	public static void main(String[] args) {
    		int[] array = {2, 4, 1, 5, 3};
    		int length = array.length;
    		quickSort(array);
    	}
    }
    • 평균 O(nlogn), 최악 O(N^2)의 시간복잡도를 갖는다고 한다.

    'CS > 알고리즘' 카테고리의 다른 글

    [Greedy] 그리디 알고리즘(탐욕법)  (0) 2021.09.13
    [BFS/DFS] 너비우선탐색과 깊이우선탐색  (0) 2021.08.31
    [정렬] 삽입정렬  (0) 2021.08.28
    [정렬] 선택정렬  (0) 2021.08.28
    [정렬] 버블정렬  (0) 2021.08.28
Designed by Tistory.