2021-10-23 Go quick sort の実装を見る / ソートアルゴリズムまとめ
Go quick sort の実装を見る
go の sort package - sort - pkg.go.dev の中身
// Sort sorts data.
// It makes one call to data.Len to determine n and O(n*log(n)) calls to
// data.Less and data.Swap. The sort is not guaranteed to be stable.
func Sort(data Interface) {
n := data.Len()
quickSort(data, 0, n, maxDepth(n))
}
Sort
内で quickSort
を call している。
func quickSort(data Interface, a, b, maxDepth int) {
for b-a > 12 { // Use ShellSort for slices <= 12 elements
if maxDepth == 0 {
heapSort(data, a, b)
return
}
maxDepth--
mlo, mhi := doPivot(data, a, b)
// Avoiding recursion on the larger subproblem guarantees
// a stack depth of at most lg(b-a).
if mlo-a < b-mhi {
quickSort(data, a, mlo, maxDepth)
a = mhi // i.e., quickSort(data, mhi, b)
} else {
quickSort(data, mhi, b, maxDepth)
b = mlo // i.e., quickSort(data, a, mlo)
}
}
if b-a > 1 {
// Do ShellSort pass with gap 6
// It could be written in this simplified form cause b-a <= 12
for i := a + 6; i < b; i++ {
if data.Less(i, i-6) {
data.Swap(i, i-6)
}
}
insertionSort(data, a, b)
}
}
面白いのは要素が12以下の場合、ShellSort を使っていて、そうでなければクイックソートを使っているというところ。
だがそれ以外にも heapSort
, insertionSort
というソートアルゴリズムがでてくる。そのへんの解説は下記記事が詳しかった。
Goのsortパッケージの実装を覗いてソートアルゴリズムに触れてみる - Qiita
ソートアルゴリズムについては下記にまとめる。
ソートアルゴリズムまとめ
クイックソート - Wikipedia
ヒープソート - Wikipedia
シェルソート - Wikipedia
挿入ソート - Wikipedia
バブルソート - Wikipedia
バイトニックソート
下記の動画がわかりやすい。
- バイトニック列(英語: bitoniq sequence): 単調非増加したあとに単調減少する列