Quick Sort

Algorithm Tag

알고리즘에 대해 공부하기 위한 태그이다.


Quick Sort

이름 부터 뭔가 되게 빠를 것 같다.

Insertion sort나 Selection sort와는 달리 글로봤을 때는 이해가 잘 안간다. 자세한 동작을 보면서 구현해보도록 하자.


Step by step

quick1

quick_re1

…반복하면 된다. 반복하다가 그룹의 크기가 1이되면 right쪽 재귀 종료. 다시 돌아와서 left쪽 그룹을 정리해준다.


정렬이 되는 이유는 pivot의 왼쪽에는 무조건 pivot보다 작은 값이 오고, 오른쪽에는 무조건 pivot보다 큰 값이 온다는 것.


Time Complexity


결론적으로 Quick sort는 O(N2)의 time complexity를 가지고(Big-O notation은 최악의 경우를 나타내기 때문), 평균적으로는 Θ(n*logn)의 time complexity를 가지게 된다.


구현

import java.io.*;
import java.util.LinkedList;

public class QuickSort {
    public static void quickSort(LinkedList<Integer> data, int l, int r) {
        int left = l; // 탐색할 부분의 왼쪽시작.
        int right = r; // 탐색할 부분의 오른쪽시작
        int pivot = data.get((l + r) / 2); // 탐색할 부분의 중간값. => 피벗값. 이 값을 기준으로 왼쪽에는 pivot보다 작은 값을 모아두고, 오른쪽에는 큰 값을 모은다.

        do {
            while (data.get(left) < pivot) left++; // 왼쪽부터 오른쪽으로 가면서 탐색. pivot 값보다 크다면 해당 index를 Left로 표시.
            while (data.get(right) > pivot) right--; // 오른쪽부터 왼쪽으로 가면서 탐색. pivot 값보다 작으면 해당 index를 Right로 표시.
            if (left <= right) { // 엇갈리지 않았다면 left와 right에 있는 값은 swap
                int temp = data.get(left); // swap...
                data.set(left, data.get(right)); // ...
                data.set(right, temp); // ...swap end
                left++; // 다음으로 탐색을 시작할 부분으로 index를 옮긴다.
                right--; // 다음으로 탐색을 시작할 부분으로 index를 옮긴다.
            }
        } while (left <= right); // 왼쪽과 오른쪽의 index가 엇갈리면 종료. pivot값을 기준으로 왼쪽 부분은 pivot보다 작고, 오른쪽 부분은 pivot값 보다 큰 수만 있게 된다.

        if (l < right) quickSort(data, l, right); // 왼쪽 index가 오른쪽탐색시작위치보다 작으면 재귀적 실행.
        if (r > left) quickSort(data, left, r); // 오른쪽 index가 왼쪽탐색시작보다 크면 재귀적 실행.
    }
}

Java의 linkedList로 구현했다.