퀵 정렬 알고리즘

퀵 정렬이란?

image

  • 퀵 정렬은 분할 정복 알고리즘이다.
  • 이름 그대로 다른 정렬 알고리즘에 비해 빠른 속도가 장점이다.
  • 불안정한 정렬이라는 특징이 있어서 값이 동일한 항목들의 순서를 보장하지 않는다.
  • 배열에서 피벗pivot 요소를 선택하고 다른 요소들이 피벗보다 큰지 작은지에 따라 두 개의 하위 배열로 나눈다. 피벗을 어떤 기준으로 선택하느냐에 따라 성능이 달라진다.

퀵 정렬 알고리즘의 흐름

분할 Divide: 하나의 요소를 피벗으로 선택하고, 이를 기준으로 작은 요소들은 피벗의 왼쪽, 큰 요소들은 피벗의 오른쪽으로 이동시킨다.
정복 Conquer: 피벗을 기준으로 배열을 두 부분으로 나누고, 각 부분을 재귀적으로 반복한다.
결합 Combine: 부분 배열들이 정렬되면, 결합하여 전체 배열을 완성한다.

시간복잡도

image

Java 예제

public void quickSort(int[] arr, int left, int right) {
    // base condition
    if (left >= right) {
        return;
    }
    int pivot = arr[right];
    
    int sortedIndex = left;
    for (int i = left; i < right; i++) {
        if (arr[i] <= pivot) {
            swap(arr, i, sortedIndex);
            sortedIndex++;
        }
    }
    swap(arr, sortedIndex, right);
    quickSort(arr, left, sortedIndex - 1);
    quickSort(arr, sortedIndex + 1, right);
}

private void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

참고

Quicksort
퀵 정렬
What is the space and time complexity of a quick sort algorithm?

수정이 필요한 부분은 댓글로 피드백 부탁드립니다!

댓글남기기