요약

내용

원리

  • 피벗(pivot)을 중심으로 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할하여 정렬하는 분할 정복 알고리즘이다.
  • 작은 값은 왼쪽, 큰 값은 오른쪽에 위치하도록 배열을 재정렬한다.
  • 재귀로 호출하고 부분 배열의 크기가 1이 되면, 전체 배열이 정렬된 상태가 된다.

시간 복잡도

  • 평균
    • O(n log n)
  • 최악, 정렬된 배열에서 첫 번째 요소를 피벗으로 선택한 경우
    • O(n^2)

장점

  • 추가 메모리 사용이 적고, 평균적으로 빠르다.

단점

  • 최악의 경우 시간 복잡도가 높을 수 있다.

구현체

package main
 
import "fmt"
 
func quickSort(arr []int, low, high int) {
	if low < high {
		pi := partition(arr, low, high)
		quickSort(arr, low, pi-1)
		quickSort(arr, pi+1, high)
	}
}
 
func partition(arr []int, low, high int) int {
	pivot := arr[high]
	i := low - 1
	for j := low; j < high; j++ {
		if arr[j] <= pivot {
			i++
			arr[i], arr[j] = arr[j], arr[i]
		}
	}
	arr[i+1], arr[high] = arr[high], arr[i+1]
	return i + 1
}
 
func main() {
	arr := []int{3, 2, 5, 4, 1}
 
	fmt.Println("Before quickSort array: ", arr)
 
	quickSort(arr, 0, len(arr)-1)
	fmt.Println("After quickSort array: ", arr)
}

참고