Go 언어 퀵 정렬 구현하기
오늘은 Go 언어로 퀵 정렬을 구현해보려 합니다.
package main
import (
"fmt"
)
정렬을 한 배열을 출력하기 위해 fmt 패키지를 가져옵니다.
func partition(arr []int) int {
인자로 준 배열을 두 파티션으로 분리할 연산이 필요하므로 함수를 따로 작성해줍니다.
pivot := arr[0]
start, end := 0, len(arr)-1
처음을 피봇으로 주고, 시작(왼쪽)과 끝(오른쪽)을 정해줍니다.
for {
for start < len(arr) && arr[start] <= pivot {
start++
}
for arr[end] > pivot {
end--
}
타 언어에서는 while문이겠지만, golang에서는 for 무한 루프를 선택한 대신 if문으로 탈출하게 됩니다.
그리고 for문 뒤에 조건식을 쓰면 해당 조건식이 성립할 때만 반복되므로, 왼쪽은 피봇보다 작거나 같을 때 증가하고 오른쪽은 피봇보다 클 때 감소합니다.
if start >= end {
arr[0], arr[end] = arr[end], arr[0]
return end
}
위 for 무한 루프를 반복하다가 start와 end가 서로 만나면, 첫번째 값과 오른쪽 값을 바꾸고 함수를 마칩니다.
arr[start], arr[end] = arr[end], arr[start]
}
}
만약 if문에 맞지 않으면 시작 값과 끝 값을 서로 바꾸어주고 처음으로 돌아가 다시 반복합니다.
func quick(arr []int) {
if len(arr) > 1 {
p := partition(arr)
quick(arr[0:p])
quick(arr[p+1:])
}
}
파티션을 나누어 주는 함수를 이용하여 정렬하는 함수를 만들어야 합니다.
길이가 1 이상이면 파티션을 나누어주는 함수를 계속 재귀적으로 호출하여 배열 분할이 되도록 작성합니다.
func main() {
arr := []int{3, 7, 4, 1, 7, 5, 4, 8}
quick(arr)
fmt.Println(arr)
}
메인 함수에서 정수형 배열을 준비하고 퀵 정렬을 수행하면 정상적으로 정렬이 되는 것을 확인 할 수 있습니다.
Written on November 11, 2018