diff --git a/README.md b/README.md index cbca464..cff5acf 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ Algorithms * [Shell sort](https://en.wikipedia.org/wiki/Shellsort) * [counting sort](https://en.wikipedia.org/wiki/Counting_sort) * [radix sort](https://en.wikipedia.org/wiki/Radix_sort) + * [bead sort](https://en.wikipedia.org/wiki/Bead_sort) #### Searching diff --git a/sorting/bead_sort.go b/sorting/bead_sort.go new file mode 100644 index 0000000..7350db5 --- /dev/null +++ b/sorting/bead_sort.go @@ -0,0 +1,53 @@ +package main + +import ( + "sync" +) + +/* + * Bead sort - https://en.wikipedia.org/wiki/Bead_sort + */ +func BeadSort(list []int) { + const bead = 'o' + max := 1000 + + all := make([]byte, max*len(list)) + abacus := make([][]byte, max) + for pole, space := 0, all; pole < max; pole++ { + abacus[pole] = space[:len(list)] + space = space[len(list):] + } + var wg sync.WaitGroup + wg.Add(len(list)) + for row, n := range list { + go func(row, n int) { + for pole := 0; pole < n; pole++ { + abacus[pole][row] = bead + } + wg.Done() + }(row, n) + } + wg.Wait() + wg.Add(max) + for _, pole := range abacus { + go func(pole []byte) { + top := 0 + for row, space := range pole { + if space == bead { + pole[row] = 0 + pole[top] = bead + top++ + } + } + wg.Done() + }(pole) + } + wg.Wait() + for row := range list { + x := 0 + for pole := 0; pole < max && abacus[pole][row] == bead; pole++ { + x++ + } + list[len(list)-1-row] = x + } +} diff --git a/sorting/sort_test.go b/sorting/sort_test.go index 0d51e6a..36ceb7f 100644 --- a/sorting/sort_test.go +++ b/sorting/sort_test.go @@ -7,9 +7,9 @@ import ( utils "github.com/0xAX/go-algorithms" ) -var funcs = []struct{ +var funcs = []struct { name string - f Sort + f Sort }{ {"shell", ShellSort}, {"selection", SelectionSort}, @@ -21,6 +21,7 @@ var funcs = []struct{ {"comb", CombSort}, {"cocktail", CocktailSort}, {"bubble", BubbleSort}, + {"bead", BeadSort}, } func TestSort(t *testing.T) {