알고리즘/정렬

퀵 정렬

Aif 2023. 8. 23. 17:16

퀵 정렬은 분할 정복 알고리즘의 일종이다.

 

퀵 정렬은 key값을 정하고 key값을 기준으로 왼쪽은 작은 값 오른쪽은 큰 값을 모은 뒤, 

 

key값을 알맞은 위치에 삽입하고 이 위치를 기준으로 분할하여 퀵 정렬을 수행한다.

 

말로만 보면 복잡하여 이해하기가 어렵다.

 

void quickSort(int* arr, int start, int end) {
    if (start >= end) return;
    
    int key = start;
    int i = start + 1;
    int j = end;
    int temp;

    while (i <= j) {
        while (arr[key] >= arr[i]) i++;
        while (arr[key] <= arr[j] && key < j) j--;

        if (j < i) {
            temp = arr[j];
            arr[j] = arr[key];
            arr[key] = temp;
        }
        else {
            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
        }
    }

    quickSort(arr, start, j - 1);
    quickSort(arr, j+1, end);
}

코드를 보면 반복문을 통해 i, j 값을 변화 시키는 부분이 있다. 

 

여기서 key값보다 작은 값은 왼쪽, 큰 값은 오른쪽으로 이동시키게 된다.

 

그러다 i와 j가 엇갈리면 key값의 알맞은 자리가 생긴 것이다. 

 

그러면 전체 반복문이 종료되고 분할 된 부분에 퀵 정렬이 시작된다.