SkillAgentSearch skills...

GoSortingAlgorithms

Various Sorting Algorithms with golang

Install / Use

/learn @kdgyun/GoSortingAlgorithms

README

한글 문서 | 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가지 주요 옵션을 제공합니다.

  1. 정렬 알고리즘 선택 특정 정렬 알고리즘만 테스트 혹은 제외하고자 한다면 테스트하고자 하는 정렬 알고리즘 이름을 찾아 변수를 true 또는 false로 변경합니다. (True : 테스트 허용, false : 테스트 비허용)

    ex) <b> SHELL_SORT Activate = true </b>

  2. 테스트 할 슬라이스의 길이 변경. 테스트할 슬라이스의 길이를 변경하려면 'lengths' 변수의 슬라이스를 원하는 값으로 설정 할 수 있습니다. 아래 예시는 길이 35, 50,000, 100,000 슬라이스에 대해 각각 테스트 하게 됩니다.

    ex) <b> var lengths = [...]int{35, 50000, 100000} </b>

  3. 슬라이스 유형 변경.
    기본적으로 오름차순, 내림차순 및 랜덤 데이터로 구성된 각각의 모든 슬라이스가 테스트됩니다. 그러나 특정 데이터 유형을 비활성화하려면 변수를 false로 변경하면 됩니다.

    ex) <b> ASCENDING_TEST Activate = false </b>

<br /> <br />

: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 | | :-: | :-: | :-: | :-: | :-: | :-: | | O(n^2) | O(n^2) | O(n) or O(n^2) | Yes | Yes | total : O(n), auxiliary : O(1) |

<br /> <br />

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 | | :-: | :-: | :-: | :-: | :-: | :-: | | O(n^2) | O(n^2) | O(n) | Yes | Yes | total : O(n), auxiliary : O(1) |

<br /> <br />

Insertion Sort

<br /> 삽입 정렬은 각 반복마다 배열의 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여 자신의 위치를 찾아 삽입요소를 찾아 올바른 위치에 배치하게 됩니다. <br />

COMPLEXITY

| Worst-Case | Average-Case | Best-Case | in-place | stable | Space Complexity | | :-: | :-: | :-: | :-: | :-: | :-: | | O(n^2) | O(n^2) | O(n) | Yes | Yes | total : O(n), auxiliary : O(1) |

<br /> <br />

Selection Sort

<br /> 선택 정렬은 정렬되지 않은 부분에서 각 반복을 통해 가장 작은 요소를 찾아 앞 위치에 배치하게 됩니다. <br />

COMPLEXITY

| Worst-Case | Average-Case | Best-Case | in-place | stable | Space Complexity | | :-: | :-: | :-: | :-: | :-: | :-: | | O(n^2) | O(n^2) | O(n^2) | Yes | No | total : O(n), auxiliary : O(1) |

<br /> <br />

Shell Sort

<br /> 셸 정렬은 삽입 정렬을 확장한 버전입니다. 먼저 일정 간격으로 서로 멀리 떨어져 있는 요소를 삽입 정렬해 나가면서 다음에는 그 사이의 간격을 줄여나가면서 정렬하게 됩니다. <br /> <br />

*적용 된 Gap 시퀀스는 다음과 같습니다. Ciura sequence <br />

COMPLEXITY

| Worst-Case | Average-Case | Best-Case | in-place | stable | Space Complexity | | :-: | :-: | :-: | :-: | :-: | :-: | | O(n^2) or O(nlog^2_n) | depends on gap sequence | O(nlog_n) or O(nlog^2_n) | Yes | No | total : O(n), auxiliary : O(1) |

<br /> <br />

Merge Sort

<br />

병합 정렬은 분할 정복 알고리즘을 기반으로 합니다.

개념적으로 병합 정렬은 다음과 같이 작동합니다:

  1. 정렬되지 않은 n개의 요소를 갖는 배열을 재귀적으로 최소 하나 이상의 요소를 포함하는 배열이 되도록 절반으로 나눕니다(요소가 한 개만 있는 배열은 정렬된 것으로 간주됩니다).
  2. 분할 된
View on GitHub
GitHub Stars11
CategoryDevelopment
Updated5d ago
Forks5

Languages

Go

Security Score

95/100

Audited on Mar 22, 2026

No findings