GoSortingAlgorithms
Various Sorting Algorithms with golang
Install / Use
/learn @kdgyun/GoSortingAlgorithmsREADME
한글 문서 | English Document
<br>
GoSortingAlgorithms
<br />Go 언어로 작성된 다양한 정렬 알고리즘들이 있습니다 :octocat:
<br /><br />
:beginner: 설치 방법
Go 언어가 설치 되어 있다면, go get 명령어를 실행하여 GoSoringAlgorithms 패키지를 받아옵니다.
$ go get github.com/kdgyun/GoSortingAlgorithms
<br /><br />
:book: 사용 설명서
간단합니다!
package main
import (
"github.com/kdgyun/GoSortingAlgorithms/sorts"
crand "crypto/rand"
"fmt"
"math"
"math/big"
"math/rand"
"sort"
)
// 랜덤 정수 슬라이스 생성기
func SliceBuilder(len int) []int {
seed, _ := crand.Int(crand.Reader, big.NewInt(math.MaxInt64))
rand.Seed(seed.Int64())
var slice []int
for i := 0; i < len; i++ {
slice = append(slice, rand.Int())
}
return slice
}
func main() {
slice := SliceBuilder(1000000)
sorts.QuickSort(slice) // sorts.____(slice []int)
isSorted := sort.SliceIsSorted(slice, func(i, j int) bool {
return slice[i] < slice[j]
})
fmt.Print(isSorted)
}
<br /><br />
:test_tube: 간단한 테스트 방법
symplytest 를 통해 쉽게 테스트 할 수 있습니다.
package main
import (
"github.com/kdgyun/GoSortingAlgorithms/simplytest"
)
func main() {
simplytest.RunTest()
}
<br />
<br />
<b>출력 예시</b>
+==================================================================================+
| Random Test |
+==================================================================================+
...
[array length : 100000]
make arrays...
running bubble sort...
running cocktail sort...
...
running intro sort...
running parallel intro sort...
running cycle sort...
+-------------------------------------------------------------------------------------------------+
| name | ns | ms | verify | (err mag)
|-------------------------------------------------------------------------------------------------|
| bubble sort | 13016202738 ns | 13016 ms | true |
|-------------------------------------------------------------------------------------------------|
| cocktail sort | 8922656474 ns | 8922 ms | true |
|-------------------------------------------------------------------------------------------------|
| tim sort | 11419013 ns | 11 ms | true |
|-------------------------------------------------------------------------------------------------|
| bitonic sort | 32333072 ns | 32 ms | true |
|-------------------------------------------------------------------------------------------------|
...
|-------------------------------------------------------------------------------------------------|
| intro sort | 6665792 ns | 6 ms | true |
|-------------------------------------------------------------------------------------------------|
| parallel intro sort | 2537508 ns | 2 ms | true |
|-------------------------------------------------------------------------------------------------|
| cycle sort | 20209957747 ns | 20209 ms | true |
+-------------------------------------------------------------------------------------------------+
<br />
<br />
Option
option.go를 통해 사용자가 쉽게 테스트 형식을 조정할 수 있으며, 3가지 주요 옵션을 제공합니다.
-
정렬 알고리즘 선택 특정 정렬 알고리즘만 테스트 혹은 제외하고자 한다면 테스트하고자 하는 정렬 알고리즘 이름을 찾아 변수를 true 또는 false로 변경합니다. (True : 테스트 허용, false : 테스트 비허용)
ex) <b> SHELL_SORT Activate = true </b>
-
테스트 할 슬라이스의 길이 변경. 테스트할 슬라이스의 길이를 변경하려면 'lengths' 변수의 슬라이스를 원하는 값으로 설정 할 수 있습니다. 아래 예시는 길이 35, 50,000, 100,000 슬라이스에 대해 각각 테스트 하게 됩니다.
ex) <b> var lengths = [...]int{35, 50000, 100000} </b>
-
슬라이스 유형 변경.
기본적으로 오름차순, 내림차순 및 랜덤 데이터로 구성된 각각의 모든 슬라이스가 테스트됩니다. 그러나 특정 데이터 유형을 비활성화하려면 변수를 false로 변경하면 됩니다.ex) <b> ASCENDING_TEST Activate = false </b>
:mag_right: 개요
Go 언어는 배열과 슬라이스가 구분되어 있습니다. 하지만, 일반적으로 기타 언어에서도 배열이 익숙하기 때문에 해당 알고리즘을 설명 할 때에는 배열로 통일하여 설명합니다.
현재 업데이트 된 정렬 알고리즘:
| name | function name | | --- | :-: | | Bubble Sort | BubbleSort | | Cocktail Sort | CocktailSort | | Insertion Sort | InsertionSort | | Selection Sort | SelectionSort | | Shell Sort | ShellSort | | Merge Sort (bottom-up) | BottomUpMergeSort | | Merge Sort (top-down) | TopDownMergeSort | | Merge Sort (parallel) | ParallelMergeSort | | Heap Sort | HeapSort | | Quick Sort (left-pivot) | QuickSortLP | | Quick Sort (middle-pivot) | QuickSort | | Quick Sort (left-pivot) | QuickSortRP | | Quick Sort (left-pivot with parallel) | ParallelQuickSortLP | | Quick Sort (middle-pivot with parallel) | ParallelQuickSort | | Quick Sort (left-pivot with parallel) | ParallelQuickSortRP | | Dual-pivot Quick Sort | DualPivotQuickSort | | Dual-pivot Quick Sort (parallel) | ParallelDualPivotQuickSort | | Binaray Insertion Sort | BinarySort | | Tim Sort | TimSort | | Bitonic Sort | BitonicSort | | Bitonic Sort (parallel) | ParallelBitonicSort | | Intro Sort | IntroSort | | Intro Sort (parallel) | ParallelIntroSort | | Cycle Sort | CycleSort | | Odd-Even Sort | OddEvenSort | | Odd-Even Merge Sort | OddEvenMergeSort | | Odd-Even Merge Sort (parallel) | ParallelOddEvenMergeSort | | Comb Sort | CombSort |
<br /> <br />Bubble Sort
<br /> 버블 정렬은 인접한 요소를 반복적으로 비교하고 교환하는 방식입니다. 해당 구현은 이미 배열이 정렬되어있는 경우 정렬을 종료하도록 최적화되어 있습니다. 최적화를 원하지 않는다면, bubbleSort 함수에서 swapped 변수를 삭제 및 해당 조건문을 삭제하면 됩니다.<br />COMPLEXITY
| Worst-Case | Average-Case | Best-Case | in-place | stable | Space Complexity |
| :-: | :-: | :-: | :-: | :-: | :-: |
| |
|
or
| Yes | Yes | total :
, auxiliary :
|
Cocktail Sort
<br /> 칵테일 정렬은 버블 정렬을 기반한 변형 된 알고리즘입니다. Cocktail shaker sort(칵테일 셰이커 정렬), bidirectional bubble sort(양방향 버블 정렬), cocktail sort(칵테일 정렬), shaker sort(셰이커 정렬) 이라고도 불립니다. <br />COMPLEXITY
| Worst-Case | Average-Case | Best-Case | in-place | stable | Space Complexity |
| :-: | :-: | :-: | :-: | :-: | :-: |
| |
|
| Yes | Yes | total :
, auxiliary :
|
Insertion Sort
<br /> 삽입 정렬은 각 반복마다 배열의 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여 자신의 위치를 찾아 삽입요소를 찾아 올바른 위치에 배치하게 됩니다. <br />COMPLEXITY
| Worst-Case | Average-Case | Best-Case | in-place | stable | Space Complexity |
| :-: | :-: | :-: | :-: | :-: | :-: |
| |
|
| Yes | Yes | total :
, auxiliary :
|
Selection Sort
<br /> 선택 정렬은 정렬되지 않은 부분에서 각 반복을 통해 가장 작은 요소를 찾아 앞 위치에 배치하게 됩니다. <br />COMPLEXITY
| Worst-Case | Average-Case | Best-Case | in-place | stable | Space Complexity |
| :-: | :-: | :-: | :-: | :-: | :-: |
| |
|
| Yes | No | total :
, auxiliary :
|
Shell Sort
<br /> 셸 정렬은 삽입 정렬을 확장한 버전입니다. 먼저 일정 간격으로 서로 멀리 떨어져 있는 요소를 삽입 정렬해 나가면서 다음에는 그 사이의 간격을 줄여나가면서 정렬하게 됩니다. <br /> <br />*적용 된 Gap 시퀀스는 다음과 같습니다. Ciura sequence <br />
COMPLEXITY
| Worst-Case | Average-Case | Best-Case | in-place | stable | Space Complexity |
| :-: | :-: | :-: | :-: | :-: | :-: |
| or
| depends on gap sequence |
or
| Yes | No | total :
, auxiliary :
|
Merge Sort
<br />병합 정렬은 분할 정복 알고리즘을 기반으로 합니다.
개념적으로 병합 정렬은 다음과 같이 작동합니다:
- 정렬되지 않은 n개의 요소를 갖는 배열을 재귀적으로 최소 하나 이상의 요소를 포함하는 배열이 되도록 절반으로 나눕니다(요소가 한 개만 있는 배열은 정렬된 것으로 간주됩니다).
- 분할 된
