오봉이와 함께하는 개발 블로그

퀵 정렬(Quick Sort) 본문

알고리즘 & 자료구조 & 네트워크

퀵 정렬(Quick Sort)

오봉봉이 2021. 12. 1. 12:43
728x90

Algorithmday_4 정리 (2021.12.01 수요일)

퀵 정렬(Quick Sort)

  • 분할 정복 정렬 방법 중 하나
  • 전체 리스트를 2개의 부분 리스트로 분할하고
  • 각각의 서브 리스트를 다시 퀵 정렬로 정렬
    • 기준 값보다 큰 값들은 오른쪽으로, 작은 값들은 왼쪽으로 재 배열
  • 정렬 방법
    • 전체 리스트에서 한 원소를 기준 값(pivot)으로 선정
    • 피벗을 기준으로 두 개의 서브 리스트로 분할
      • 왼쪽 : 피벗보다 작은 값의 원소들로 구성
      • 오른쪽 : 피벗보다 크거나 같은 값의 원소들로 구성
    • 각각의 파티션(서브 리스트)에 대해 다시 퀵 정렬을 순환 적용
      • 피벗 선정 및 파티션 분할
  • 퀵 정렬 수행 순서
  • 피벗(pivot) : 가장 왼쪽 숫자를 피벗으로 선정
  • 두 개의 변수 : low와 high(이동)
    • low는 왼쪽에 위치
    • high는 오른쪽에 위치
  • low : 오른쪽으로 이동하면서 피벗 보다 큰 숫자를 찾음
    • 피벗 보다 작으면 통과, 큰 숫자를 찾으면 정지
  • high : 왼쪽으로 이동하면서 피벗 보다 작은 숫자를 찾음
    • 피벗 보다 크면 통과, 작은 숫자를 찾으면 정지
  • 정지된 위치의 숫자들 서로 교환
  • low와 high가 교차하면 종료. high와 pivot 교환






퀵 정렬 예제 코드
  • QuickSort.java
public class QuickSort {
    public static void main(String[] args) {
        int [] arr = {8,5,4,6,3,1,2,7,9};
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
    static void quickSort(int[] arr, int low, int high) {
        if(low >= high) {
            return;
        }
        int pivot = low;
        int i = low + 1;
        int j = high;
        int temp;
        while(i <= j) { // 교차할 때 까지 반복 j가 i보다 크면 while문 종료
            while(i <= high && arr[i] < arr[pivot]) { // 피벗보다 큰 값을 만날 때 까지 반복
                i++;
            }
            while (j > low && arr[j] >= arr[pivot]) { // 피벗보다 작은 값을 만날 때 까지 반복
                j--;
            }
            if(i > j) { // 교차한 상태가 되면 피복과 j 교환
                temp = arr[j];
                arr[j] = arr[pivot];
                arr[pivot] = temp;
            }
            else { // i와 j값 교환
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        quickSort(arr, low, j-1);
        quickSort(arr, j+1, high);
    }
}
728x90

'알고리즘 & 자료구조 & 네트워크' 카테고리의 다른 글

기수 정렬(Radix Sort)  (0) 2021.12.01
이원 합병 정렬(Two-way Merge Sort)  (0) 2021.12.01
쉘 정렬(Shell Sort)  (0) 2021.12.01
삽입 정렬(Insertion Sort)  (0) 2021.12.01
선택 정렬(Selection Sort)  (0) 2021.12.01
Comments