Quick Sort


무작위로 선정된 한 원소를 사용하여 배열을 분할하는데, 선정된 원소보다 작은 원소들은 앞에, 큰 원소들은 뒤로 보낸다.

배열 분할에 사용되는 원소가 중간값(median), 적어도 중간값에 가까운 값이 되리라는 보장이 없기 때문에, 정렬 알고리즘이 느리게 동작할 수도 있다. **최악의 경우ㅡpivot 값을 기준으로 모든 값들이 한 편으로 몰리는 경우, 수행 시간이 O(n^2)이 될 수도 있다.

public class QuickSortExample {
  void quickSort(int[] arr, int left, int right) {
    if (left >= right) return;  // 원소 1개인 경우

    int index = partition(arr, left, right);

    if (left < index - 1) {  // 왼쪽 절반 정렬
      quickSort(arr, left, index - 1);
    }
    if (index < right) {    // 오른쪽 절반 정렬
      quickSort(arr, index, right);
    }
  }

  int partition(int[] arr, int left, int right) {
    int pivot = arr[(left+right)/2]; // 분할 기준 원소 생성

    while (left <= right) {
      // 왼쪽에서 오른쪽으로 옮겨야 하는 원소 탐색
      while (arr[left] < pivot) left++;

      // 오른쪽에서 왼쪽으로 옮겨야 하는 원소 탐색
      while (arr[right] > pivot) right--;

      // 원소를 스왑한 뒤 left와 right를 이동
      if (left <= right) {
        swap(arr, left, right);
        left++;
        right--;
      }
    }
    return left;
  }

  void swap(int[] arr, int left, int right) {
    int temp = arr[left];
    arr[left] = arr[right];
    arr[right] = temp;
  }
}