📈알고리즘/알고리즘

퀵정렬 이해하기

하얀성 2023. 3. 20. 15:20

퀵정렬 함수 과정(수도 코드)

(※ p , left, right는 value 값이 아니라 index 값을 의미한다.)

 

1. 임의의 index 값인 p(pivot)를 지정.

 

2. [left] (맨 왼쪽 값, [0]이 아니라, 범위의 제일 왼쪽값 ex) 5~11 일 경우 [5]가 [left]) 

    [left]와 [p] 자리를 변경.

2-1. p가 left 라면 그대로 자리를 유지한다.

 

3. [p] 를 제외한 나머지 값들을 p의 value를 기준으로 값 비교 후, 위치 이동 [(p보다 작은 무리), (p보다 큰 무리)]

 

4. [p]가 바꾸기 이전의, [left] 값과 다시 자리를 바꾸는게 아니라...... 무조건 p를 p보다 작은 무리의 가장 오른쪽에 위치한 값과 자리를 바꾼다. 

4-1. p보다 큰 값들만 있다면 p의 자리를 [left]에 고정 시킨다. 

 

5. p의 자리는 확고 해졌고, 나머지는 p를 기준으로 재배치 되었다. 따라서 나머지 값들을 가지고 1~4 과정을 반복한다.

 

if 조건 (left < right) 조건이 성립되지 않으면 함수 종료. (서로 비교할 값이 더는 없이 1개만 있다는 의미이자, 정렬완료를 의미)


관련 예제


<js로 코드 구현하기>

function quickSort(arr) {
  if(arr.length < 2) {
    return arr
  }
  let pivot = arr[arr.length - 1]
  let left = []
  let right = []
  for(let i = 0; i < arr.length - 1; i++) {
    if(arr[i] < pivot) { // pivot 기준으로 left, right 각 push
      left.push(arr[i])
    }else {
      right.push(arr[i])
    }    
  }
  return [...quickSort(left), pivot, ...quickSort(right)]
  // pivot은 냅두고 작은 곳은 작은 곳끼리, 큰 곳은 큰 곳끼리 다시 pivot을 뽑아서 quickSort를 실행한다.
}

const arr = [8, 20, -2, 4, -6, 9, 21, -4, -7]
// 가장 작은 값이 첫 pivot이 되도록하고 돌려봣으나 문제가 없다. // 그저 반복문 횟수만 더 늘어나는듯하다.
console.log(quickSort(arr))

// Worst case = O(n^2)
// Avg case = O(nlogn)

 

<실행결과>