1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Goでのアルゴリズムクイックリファレンス第2版(バケツソート)

Last updated at Posted at 2017-05-30

Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。アルゴリズムクイックリファレンス 第2版を読んで各種アルゴリズムをGoで実装して行きます。

前回: Goでのアルゴリズムクイックリファレンス第2版(4.4 クイックソート)

今回はバケツソート

  • 整列したいデータの取り得る値がm種類であるとき

  • m個のバケツを用意しておき

  • 値毎に1個のバケツを対応づける

  • 元のデータ列を捜査して

  • 各データに対応するバケツに入れておく

  • この処理が終わった後

  • 整列したい順序にしたがってバケツから値を取り出せば

  • データをソートすることができる

  • 成立する性質

    • 一様分布
    • 順序のついたハッシュ関数

package main

import "fmt"

const BUCKETS = 10

func bucketSort(a *[]int, size int) {
	var i, j, k int
	buckets := make([]int, BUCKETS)
	for j = 0; j < BUCKETS; j++ {
		buckets[j] = 0
	}
	for i = 0; i < size; i++ {
		buckets[(*a)[i]]++
	}
	i = 0
	for j = 0; j < BUCKETS; j++ {
		for k = buckets[j]; k > 0; k-- {
			(*a)[i] = j
			i++
		}
	}
}

func main() {
	ary := []int{3, 2, 1, 9, 5, 7}
	fmt.Println(ary)
	bucketSort(&ary, len(ary))
	fmt.Println(ary)
}

実装しつつ、改めて考えてなるほど確かにこれは最初の条件に従う時にしかできないソートですね。なんか、クイックリファレンスが次のアルゴリズムを決めるベースになってしまっている。今回は入門データ構造とアルゴリズムのやり方がコンパクトだったのでそちらでやってしまった。hash関数を作る方法であとでもう一度tryしたい。

次回はマージソートの予定です。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?