Skip to content

kdgyun/GoSortingAlgorithms

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

79 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

ํ•œ๊ธ€ ๋ฌธ์„œ | English Document


GoSortingAlgorithms


Go ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋‹ค์–‘ํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค :octocat:



๐Ÿ”ฐ ์„ค์น˜ ๋ฐฉ๋ฒ•

Go ์–ธ์–ด๊ฐ€ ์„ค์น˜ ๋˜์–ด ์žˆ๋‹ค๋ฉด, go get ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ GoSoringAlgorithms ํŒจํ‚ค์ง€๋ฅผ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.

$ go get github.com/kdgyun/GoSortingAlgorithms



๐Ÿ“– ์‚ฌ์šฉ ์„ค๋ช…์„œ

๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค!

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)
}



๐Ÿงช ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

symplytest ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

package main

import (
	"github.com/kdgyun/GoSortingAlgorithms/simplytest"
)

func main() {
	simplytest.RunTest()
}


์ถœ๋ ฅ ์˜ˆ์‹œ


+==================================================================================+
|                                   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 |
+-------------------------------------------------------------------------------------------------+



Option

option.go๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธ ํ˜•์‹์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, 3๊ฐ€์ง€ ์ฃผ์š” ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  1. ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ ํŠน์ • ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ํ…Œ์ŠคํŠธ ํ˜น์€ ์ œ์™ธํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด๋ฆ„์„ ์ฐพ์•„ ๋ณ€์ˆ˜๋ฅผ true ๋˜๋Š” false๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. (True : ํ…Œ์ŠคํŠธ ํ—ˆ์šฉ, false : ํ…Œ์ŠคํŠธ ๋น„ํ—ˆ์šฉ)

    ex) SHELL_SORT Activate = true

  2. ํ…Œ์ŠคํŠธ ํ•  ์Šฌ๋ผ์ด์Šค์˜ ๊ธธ์ด ๋ณ€๊ฒฝ. ํ…Œ์ŠคํŠธํ•  ์Šฌ๋ผ์ด์Šค์˜ ๊ธธ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด 'lengths' ๋ณ€์ˆ˜์˜ ์Šฌ๋ผ์ด์Šค๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ์„ค์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋Š” ๊ธธ์ด 35, 50,000, 100,000 ์Šฌ๋ผ์ด์Šค์— ๋Œ€ํ•ด ๊ฐ๊ฐ ํ…Œ์ŠคํŠธ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

    ex) var lengths = [...]int{35, 50000, 100000}

  3. ์Šฌ๋ผ์ด์Šค ์œ ํ˜• ๋ณ€๊ฒฝ.
    ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ ๋ฐ ๋žœ๋ค ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ๊ฐ์˜ ๋ชจ๋“  ์Šฌ๋ผ์ด์Šค๊ฐ€ ํ…Œ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠน์ • ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋ณ€์ˆ˜๋ฅผ false๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    ex) ASCENDING_TEST Activate = false



๐Ÿ”Ž ๊ฐœ์š”

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


Bubble Sort


๋ฒ„๋ธ” ์ •๋ ฌ์€ ์ธ์ ‘ํ•œ ์š”์†Œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋น„๊ตํ•˜๊ณ  ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ตฌํ˜„์€ ์ด๋ฏธ ๋ฐฐ์—ด์ด ์ •๋ ฌ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์ •๋ ฌ์„ ์ข…๋ฃŒํ•˜๋„๋ก ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, bubbleSort ํ•จ์ˆ˜์—์„œ swapped ๋ณ€์ˆ˜๋ฅผ ์‚ญ์ œ ๋ฐ ํ•ด๋‹น ์กฐ๊ฑด๋ฌธ์„ ์‚ญ์ œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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)


Cocktail Sort


์นตํ…Œ์ผ ์ •๋ ฌ์€ ๋ฒ„๋ธ” ์ •๋ ฌ์„ ๊ธฐ๋ฐ˜ํ•œ ๋ณ€ํ˜• ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. Cocktail shaker sort(์นตํ…Œ์ผ ์…ฐ์ด์ปค ์ •๋ ฌ), bidirectional bubble sort(์–‘๋ฐฉํ–ฅ ๋ฒ„๋ธ” ์ •๋ ฌ), cocktail sort(์นตํ…Œ์ผ ์ •๋ ฌ), shaker sort(์…ฐ์ด์ปค ์ •๋ ฌ) ์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

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)


Insertion Sort


์‚ฝ์ž… ์ •๋ ฌ์€ ๊ฐ ๋ฐ˜๋ณต๋งˆ๋‹ค ๋ฐฐ์—ด์˜ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด ๋ถ€๋ถ„๊ณผ ๋น„๊ตํ•˜์—ฌ ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…์š”์†Œ๋ฅผ ์ฐพ์•„ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ๋ฐฐ์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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)


Selection Sort


์„ ํƒ ์ •๋ ฌ์€ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„์—์„œ ๊ฐ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ๊ฐ€์žฅ ์ž‘์€ ์š”์†Œ๋ฅผ ์ฐพ์•„ ์•ž ์œ„์น˜์— ๋ฐฐ์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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)


Shell Sort


์…ธ ์ •๋ ฌ์€ ์‚ฝ์ž… ์ •๋ ฌ์„ ํ™•์žฅํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ๋จผ์ € ์ผ์ • ๊ฐ„๊ฒฉ์œผ๋กœ ์„œ๋กœ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ์š”์†Œ๋ฅผ ์‚ฝ์ž… ์ •๋ ฌํ•ด ๋‚˜๊ฐ€๋ฉด์„œ ๋‹ค์Œ์—๋Š” ๊ทธ ์‚ฌ์ด์˜ ๊ฐ„๊ฒฉ์„ ์ค„์—ฌ๋‚˜๊ฐ€๋ฉด์„œ ์ •๋ ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

*์ ์šฉ ๋œ Gap ์‹œํ€€์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Ciura sequence

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)


Merge Sort


๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋…์ ์œผ๋กœ ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

  1. ์ •๋ ฌ๋˜์ง€ ์•Š์€ n๊ฐœ์˜ ์š”์†Œ๋ฅผ ๊ฐ–๋Š” ๋ฐฐ์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ์ตœ์†Œ ํ•˜๋‚˜ ์ด์ƒ์˜ ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฐ์—ด์ด ๋˜๋„๋ก ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค(์š”์†Œ๊ฐ€ ํ•œ ๊ฐœ๋งŒ ์žˆ๋Š” ๋ฐฐ์—ด์€ ์ •๋ ฌ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค).
  2. ๋ถ„ํ•  ๋œ ๋ฐฐ์—ด์ด ๋ชจ๋‘ ํ•ฉ์ณ์งˆ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ •๋ ฌ ํ•ฉ๋‹ˆ๋‹ค.


3๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ณ‘ํ•ฉ ์ •๋ ฌ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • top-down
    ํ•˜ํ–ฅ์‹ ๋ณ‘ํ•ฉ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ถ„ํ•  ๋œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 1์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐฐ์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ• ํ•œ ๋‹ค์Œ ํ•ด๋‹น ํ•˜์œ„ ๋ฐฐ์—ด๋“ค์„ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ •๋ ฌ๋œ ๋ชฉ๋ก์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • bottom-up
    ์ƒํ–ฅ์‹ ๋ณ‘ํ•ฉ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํฌ๊ธฐ๊ฐ€ 1์ธ n๊ฐœ์˜ ํ•˜์œ„ ๋ฐฐ์—ด์„ ๋‘ ๋ฒ„ํผ ์‚ฌ์ด์—์„œ ์•ž ๋’ค๋กœ ํ•˜์œ„ ๋ฐฐ์—ด๋“ค์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • parallel
    ๋ณ‘๋ ฌ ๋ณ‘ํ•ฉ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๋ณ‘๋ ฌํ™”๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ž„๊ณ„๊ฐ’๋ณด๋‹ค ์ž‘์•„์งˆ ๋•Œ๊นŒ์ง€ ๋ฐฐ์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ• ํ•œ ๋‹ค์Œ ๋ณ‘ํ•ฉํ•˜๋Š” ํ•˜ํ–ฅ์‹ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ, ์ž„๊ณ„๊ฐ’๋ณด๋‹ค ์ž‘์€ ํ•˜์œ„ ๋ฐฐ์—ด๋“ค์€ ์ƒํ–ฅ์‹ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

COMPLEXITY

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


Heap Sort


ํž™ ์ •๋ ฌ์€ ๋ฐฐ์—ด์„ ํž™์˜ ์›๋ฆฌ์ฒ˜๋Ÿผ ๋ฐฐ์—ด์—์„œ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•œ ๋‹ค์Œ ๋ฐฐ์—ด์˜ ์ •๋ ฌ๋œ ๋ถ€๋ถ„์— ์‚ฝ์ž…ํ•˜์—ฌ ์ •๋ ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

COMPLEXITY

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


Quick Sort


ํ€ต ์ •๋ ฌ์€ ๋ฐฐ์—ด์—์„œ ํŠน์ • ํ”ผ๋ฒ—์„ ์„ ํƒํ•œ ๋‹ค์Œ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€์ง€ ํฐ์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์š”์†Œ๋ฅผ ๋‘ ๊ฐœ์˜ ํ•˜์œ„ ๋ฐฐ์—ด๋กœ ๋ถ„ํ• ํ•˜๊ฒŒ ๋˜๋Š” ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์žฌ๊ท€์ ์œผ๋กœ ์ด ๊ณผ์ •์„ ๊ฑฐ์ณ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

3๊ฐ€์ง€ ์œ ํ˜•์˜ ํ€ต ์ •๋ ฌ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • left-pivot (+parallel)
    ์™ผ์ชฝ ํ”ผ๋ฒ— ํ€ต ์ •๋ ฌ์€ ์™ผ์ชฝ ์š”์†Œ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
  • middle-pivot (+parallel)
    ์ค‘๊ฐ„ ํ”ผ๋ฒ— ํ€ต ์ •๋ ฌ์€ ์ค‘๊ฐ„ ์š”์†Œ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
  • right-pivot (+parallel)
    ์˜ค๋ฅธ์ชฝ ํ”ผ๋ฒ— ํ€ต ์ •๋ ฌ์€ ์˜ค๋ฅธ์ชฝ ์š”์†Œ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๋ณ‘๋ ฌํ™”๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

COMPLEXITY

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


Dual-Pivot Quick Sort


์ด์ค‘ ํ”ผ๋ฒ— ํ€ต ์ •๋ ฌ์€ Quick Sort๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ, ๋ฐฐ์—ด์—์„œ ๋‘ ๊ฐœ์˜ ์š”์†Œ๋ฅผ ํ”ผ๋ฒ—(pivot)์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ ฌํ•  ๋ฐฐ์—ด์—์„œ ๋‘ ๊ฐœ์˜ ์š”์†Œ(ํ”ผ๋ฒ—)๋ฅผ ์„ ํƒํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์š”์†Œ๋“ค์„ ์ž‘์€ ํ”ผ๋ฒ—(small pivot)๋ณด๋‹ค ์ž‘์€ ์š”์†Œ, ํ”ผ๋ฒ— ์‚ฌ์ด์— ์žˆ๋Š” ์š”์†Œ, ํฐ ํ”ผ๋ฒ—(big pivot)๋ณด๋‹ค ํฐ ์š”์†Œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฐฐ์—ด์„ ๋ถ„ํ• ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ํŒŒํ‹ฐ์…˜์„ ์žฌ๊ท€์ ์ธ ๊ณผ์ •์„ ํ†ตํ•ด ์ •๋ ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

2๊ฐ€์ง€ ์œ ํ˜•์˜ ์ด์ค‘ ํ”ผ๋ฒ— ํ€ต ์ •๋ ฌ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • non-parallel
    ์ •๋ ฌํ•  ๋ฐฐ์—ด์—์„œ ๋‘ ๊ฐœ์˜ ์š”์†Œ(ํ”ผ๋ฒ—)๋ฅผ ์„ ํƒํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์š”์†Œ๋“ค์„ ์ž‘์€ ํ”ผ๋ฒ—(small pivot)๋ณด๋‹ค ์ž‘์€ ์š”์†Œ, ํ”ผ๋ฒ— ์‚ฌ์ด์— ์žˆ๋Š” ์š”์†Œ, ํฐ ํ”ผ๋ฒ—(big pivot)๋ณด๋‹ค ํฐ ์š”์†Œ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ฐฐ์—ด์„ ๋ถ„ํ• ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ํŒŒํ‹ฐ์…˜์„ ์žฌ๊ท€์ ์ธ ๊ณผ์ •์„ ํ†ตํ•ด ์ •๋ ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • parallel
    ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๋ณ‘๋ ฌํ™”๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ถ„ํ•  ๋œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ž„๊ณ„๊ฐ’๋ณด๋‹ค ์ž‘์„ ๋•Œ๊นŒ์ง€ ๋ฐฐ์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ• ํ•œ ๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ •๋ ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

COMPLEXITY

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


Binary Insertion Sort


์ด์ง„ ์‚ฝ์ž… ์ •๋ ฌ์€ ์‚ฝ์ž… ์ •๋ ฌ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ํ™•์žฅ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ด์ง„ ์ •๋ ฌ์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ง„ ์‚ฝ์ž… ์ •๋ ฌ์€ ์ด์ง„ ๊ฒ€์ƒ‰(Binary Search)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ฐ˜๋ณต ๊ณผ์ •์—์„œ ํŠน์ • ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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)


Tim Sort


Timsort๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ์—์„œ ์ž˜ ์ˆ˜ํ–‰๋˜๋„๋ก ์„ค๊ณ„๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋ณ‘ํ•ฉ ์ •๋ ฌ๊ณผ ์‚ฝ์ž… ์ •๋ ฌ(๋˜๋Š” ์ด์ง„ ์‚ฝ์ž… ์ •๋ ฌ)์—์„œ ํŒŒ์ƒ๋˜์–ด ํ˜ผํ•ฉ ๋œ ์•ˆ์ •์ ์ธ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋‹ˆ๋‹ค. Python ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด 2002๋…„ Tim Peters์— ์˜ํ•ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

COMPLEXITY

Worst-Case Average-Case Best-Case in-place stable Space Complexity
O(nlog_n) O(nlog_n) O(n) Yes yes total : O(n), auxiliary : O(n)


Bitonic Sort


๋ฐ”์ดํ† ๋‹‰ ์ •๋ ฌ์€ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๊ต ๊ธฐ๋ฐ˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ๋ฌด์ž‘์œ„ ์ˆซ์ž ์‹œํ€€์Šค๋ฅผ ๋‹จ์กฐ ์ฆ๊ฐ€ํ–ˆ๋‹ค๊ฐ€ ๊ฐ์†Œํ•˜๋Š” ๋น„ํŠธ ์‹œํ€€์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ๋ณ‘๋ ฌ ํ™˜๊ฒฝ์— ์ตœ์ ํ™” ๋˜์–ด์žˆ์œผ๋ฉฐ GPU ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ๊ธฐํƒ€ ๋ณ‘๋ ฌํ™”ํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ GO ์–ธ์–ด์˜ ๋™์‹œ์„ฑ ๋ชจ๋ธ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

2๊ฐ€์ง€ ์œ ํ˜•์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • non-parallel
    ๋ถ„ํ•  ๋œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 1์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐฐ์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ• ํ•œ ๋‹ค์Œ Bitonic Sequencing Rule์— ๋”ฐ๋ผ ํ•ด๋‹น ํ•˜์œ„ ๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ •๋ ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • parallel
    ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๋ณ‘๋ ฌํ™”๋ฅผ ํ†ตํ•ด ๋ถ„ํ•  ๋œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ž„๊ณ„๊ฐ’๋ณด๋‹ค ์ž‘์•„์งˆ ๋•Œ๊นŒ์ง€ ๋ฐฐ์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ• ํ•œ ๋‹ค์Œ ๋น„๋ณ‘๋ ฌํ™”๋กœ ์ „ํ™˜ํ•˜์—ฌ Bitonic Sequencing Rule์— ๋”ฐ๋ผ ํ•˜์œ„ ๋ฐฐ์—ด์„ ๋ถ„ํ•  ๋ฐ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

COMPLEXITY

Type Worst-Case Average-Case Best-Case in-place stable Space Complexity
non-parallel O(nlog^2_n) O(nlog^2_n) O(nlog^2_n) Yes No total : O(nlog^2_n), auxiliary : O(nlog^2_n)
parallel O(log^2_n) O(log^2_n) O(log^2_n) Yes No total : O(nlog^2_n), auxiliary : O(nlog^2_n)


Intro Sort


์ธํŠธ๋กœ ์ •๋ ฌ์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ํ‰๊ท ์ ์œผ๋กœ ๋น ๋ฅธ ์„ฑ๋Šฅ๊ณผ ๋ฐ (์ ๊ทผ์ ์œผ๋กœ) ์ตœ์ ํ™” ๋œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ํ€ต์ •๋ ฌ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ์žฌ๊ท€ ๊นŠ์ด๊ฐ€ ์ •๋ ฌ๋˜๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ ๊ฐœ์ˆ˜์— ๋”ฐ๋ฅธ ๊นŠ์ด ์ž„๊ณ„๊ฐ’(maximum depth: 2ceil(log2_n) ) ์ˆ˜์ค€์„ ์ดˆ๊ณผํ•˜๋ฉด ํž™ ์ •๋ ฌ๋กœ ์ „ํ™˜ํ•˜๊ณ  ๋ถ„ํ•  ๋œ ๋ฐฐ์—ด์˜ ์š”์†Œ ๊ฐœ์ˆ˜๊ฐ€ ๊ธธ์ด ์ž„๊ณ„๊ฐ’(16) ๋ฏธ๋งŒ์ด๋ฉด ์‚ฝ์ž… ์ •๋ ฌ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.



2๊ฐ€์ง€ ์œ ํ˜•์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • non-parallel
    ์ •๋ ฌํ•  ๋ฐฐ์—ด์—์„œ ํ€ต ์ •๋ ฌ์„ ์‚ฌ์šฉํ•  ๋•Œ ์š”์†Œ(ํ”ผ๋ฒ—)๋ฅผ ์„ ํƒํ•˜๊ณ  ์„ ํƒ ๋œ ํ”ผ๋ฒ—์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์š”์†Œ๋“ค์ด ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ํฐ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‘ ๊ฐœ์˜ ํ•˜์œ„ ๋ฐฐ์—ด๋กœ ๋ถ„ํ• ํ•˜๊ณ  ์žฌ๊ท€ ๊นŠ์ด๊ฐ€ ํŠน์ • ์ž„๊ณ„๊ฐ’(maximum depth: 2ceil(log2_n) )์„ ๋„˜๊ธฐ ์ „๊นŒ์ง€ ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ์žฌ๊ท€์ ์œผ๋กœ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

  • parallel
    ์žฌ๊ท€ ํ˜ธ์ถœ์˜ ๋ณ‘๋ ฌํ™”๋ฅผ ํ†ตํ•ด ๊ฐ ๋ณ‘๋ ฌํ™” ๋œ ์ด์ค‘ ํ”ผ๋ฒ— ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ถ„ํ•  ๋œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ž„๊ณ„๊ฐ’๋ณด๋‹ค ์ž‘์•„์ง€๊ธฐ ์ „๊นŒ์ง€ ๋ฐฐ์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.


COMPLEXITY

Worst-Case Average-Case Best-Case in-place stable Space Complexity
O(nlog_n) O(nlog_n) O(nlog_n) Yes No total : O(n), auxiliary : O(log_n)


Cycle Sort


์ˆœํ™˜ ์ •๋ ฌ์€ in-place ์ •๋ ฌ์ด์ž ๋ถˆ์•ˆ์ • ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์ด ์“ฐ๊ธฐ(write) ์ˆ˜์˜ ๊ด€์ ์—์„œ ๊ฐ€์žฅ ์ ๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•œ ๋น„๊ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋‹ˆ๋‹ค.

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)


Odd-Even Sort


์ปดํ“จํŒ… ์‹œ์Šคํ…œ ๊ด€์ ์—์„œ ํ™€์ง ์ •๋ ฌ์€ ์›๋ž˜ ์ƒํ˜ธ ๋กœ์ปฌ ์—ฐ๊ฒฐ์˜ ๋ณ‘๋ ฌ ํ”„๋กœ์„ธ์„œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค

COMPLEXITY

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


Odd-Even Merge Sort


ํ™€์ง ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์‚ฌ์ด์ฆˆ๋Š” O(n(log_n)^2) , ๊นŠ์ด๋Š” O((log_n)^2) ๋ฅผ ๊ฐ–๋Š” ๋„คํŠธ์›Œํฌ ์ •๋ ฌ์„ ์œ„ํ•ด Ken Batcher ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋‹ˆ๋‹ค.


COMPLEXITY

Type Worst-Case Average-Case Best-Case in-place stable Space Complexity
non-parallel O(nlog^2_n) O(nlog^2_n) O(nlog^2_n) Yes yes total : O(nlog^2_n), auxiliary : O(nlog^2_n)
parallel O(log^2_n) O(log^2_n) O(log^2_n) Yes yes total : O(nlog^2_n), auxiliary : O(nlog^2_n)


Comb Sort


์ฝค ์ •๋ ฌ์€ ์›๋ž˜ 1980๋…„ Wล‚odzimierz Dobosiewicz์™€ Artur Borowy๊ฐ€ ์„ค๊ณ„ํ•œ ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋‚˜์ค‘์— Stephen Lacey์™€ Richard Box๊ฐ€ 1991๋…„์— ์žฌ๋ฐœ๊ฒฌ(์ด ๋•Œ "Combsort"๋ผ๊ณ  ์ด๋ฆ„์„ ์ง€์ •)ํ–ˆ์Šต๋‹ˆ๋‹ค. Comb ์ •๋ ฌ์€ ์…ธ ์ •๋ ฌ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฒ„๋ธ” ์ •๋ ฌ์„ ๊ฐœ์„ ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ ์‹œํ‚จ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

COMPLEXITY

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