상세 컨텐츠

본문 제목

Golang Algorithm - quickSort

Programming Language/Go

by Yongari 2023. 2. 12. 22:36

본문

퀵 정렬이란?

https://ko.wikipedia.org/wiki/%ED%80%B5_%EC%A0%95%EB%A0%AC

 

퀵 정렬 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 퀵 정렬(Quicksort)은 찰스 앤터니 리처드 호어가 개발한 정렬 알고리즘이다. 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬에 속한다. 퀵 정렬은 n개의 데

ko.wikipedia.org

다른 원소와의 비교만으로 정렬을 수행하는 비교정렬에 속하고 n개의 데이터를 정렬할 때 최악의 경우에는  O(n^2)번의 비교를 수행하고 평균적으로 O(n log n)번의 비교를 수행한다. 

 

 

go로 구현하는 quickSort

 

이번 quickSort에서도 지난번 bubbleSort2와 마찬가지로 난수를 생성해서 배열에 넣고 그 배열을 가지고 퀵정렬을 수행했다.

 

 

각 함수의 역할

 

 

main() : 20개의 난수 배열을 생성하는 함수 generateSlice를 호출한 뒤 quicksort 함수를 호출하는 메인 함수

generateSlice() : slice를 초기화한뒤 slice 배열에 1부터 999까지의 난수 -  1부터 999까지의 난수를 계산한 원소를 삽인한 배열(slice)을 리턴한다. 

quicksort() : 소스코드 순서는 다음과 같다. 

  • 배열의 길이가 2미만이면 배열 반환
  • left, right, pivot 변수로 인덱스 위치 지정 
  • right와 pivot 위치 교환
  • 배열 a의 길이만큼 반복순회하면서 right 인덱스 값이 i보다 크면 left와 i 인덱스 교환
    left 변수에서 ++를 수행 
  • left 변수와 right 위치 교환
  • 재귀호출로 left 인덱스를 기준으로 왼쪽, 오른쪽 quicksort 함수 호출

 

 

Go 소스 코드

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
    //배열 무작위 생성 
	slice := generateSlice(20)
    //정렬 전 배열 
	fmt.Println("\n--- Unsorted --- \n\n", slice) 
    //퀵정렬 함수 호출 
	quicksort(slice)
    //정렬 후 배열 
	fmt.Println("\n--- Sorted ---\n\n", slice, "\n")
}

// Generates a slice of size, size filled with random numbers
func generateSlice(size int) []int {
    //slice 초기화 
	slice := make([]int, size, size)
    //유닉스시간 나노초 
	rand.Seed(time.Now().UnixNano())
	
    //1부터 999 난수 - 1부터 999난수를 원소로하는 배열 생성 
    for i := 0; i < size; i++ {
		slice[i] = rand.Intn(999) - rand.Intn(999)
	}
	return slice
}
 
func quicksort(a []int) []int {

    //배열 길이가 2 미만이면 a를 리턴 
    if len(a) < 2 {
        return a
    }
     
    //left는 0, right는 배열 길이 - 1 
    left, right := 0, len(a)-1
     
    //pivot은 랜덤난수를 a 길이로 나눈 나머지 
    pivot := rand.Int() % len(a)
     
    //right와 pivot 위치 바꾸기 
    a[pivot], a[right] = a[right], a[pivot]
     
    //a의 길이만큼 반복  right 인덱스가 i보다 크면  left와 i 원소 위치 교환, 이후 left에 ++를 대입 
    for i, _ := range a {
        if a[i] < a[right] {
            //i요소가 right보다 작으면 
            //a left와 a i의 위치를 교환 
            a[left], a[i] = a[i], a[left]
            //left ++ 
            left++
        }
    }
     
    //left와 right 위치 교환 
    a[left], a[right] = a[right], a[left]
     
    //재귀호출 
    quicksort(a[:left])
    quicksort(a[left+1:])
     
    return a
}

 

 

출력 값

go run quick_Sort.go 

--- Unsorted --- 

 [291 377 604 -127 -212 419 -26 -318 -525 391 229 -564 -335 242 68 -288 -242 -84 343 188]

--- Sorted ---

 [-564 -525 -335 -318 -288 -242 -212 -127 -84 -26 68 188 229 242 291 343 377 391 419 604]

관련글 더보기