From ddaf7f7c383840066cf0dfac6b6ec80099d2c84f Mon Sep 17 00:00:00 2001 From: decanus Date: Sun, 16 Feb 2020 17:30:36 +0100 Subject: [PATCH 1/2] sortition type definition + benchmarks and tests --- sorting/bubble_sort.go | 12 +------- sorting/cocktail_sort.go | 13 ++------ sorting/comb_sort.go | 12 +------- sorting/counting_sort.go | 14 ++------- sorting/gnome_sort.go | 14 +-------- sorting/heap_sort.go | 14 ++------- sorting/insertion_sort.go | 16 +--------- sorting/merge_sort.go | 12 -------- sorting/odd_even_sort.go | 18 +++-------- sorting/quick_sort.go | 15 ++++------ sorting/selection_sort.go | 14 ++------- sorting/shell_sort.go | 29 ++++++------------ sorting/sort.go | 4 +++ sorting/sort_test.go | 63 +++++++++++++++++++++++++++++++++++++++ 14 files changed, 98 insertions(+), 152 deletions(-) create mode 100644 sorting/sort.go create mode 100644 sorting/sort_test.go diff --git a/sorting/bubble_sort.go b/sorting/bubble_sort.go index 97ac894..05a62ef 100644 --- a/sorting/bubble_sort.go +++ b/sorting/bubble_sort.go @@ -4,15 +4,7 @@ package main * Bubble sort - http://en.wikipedia.org/wiki/Bubble_sort */ -import "fmt" - -import "github.com/0xAX/go-algorithms" - -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - +func BubbleSort(arr []int) { for i := 0; i < len(arr); i++ { for j := 0; j < len(arr)-1-i; j++ { if arr[j] > arr[j+1] { @@ -20,6 +12,4 @@ func main() { } } } - - fmt.Println("Sorted array is: ", arr) } diff --git a/sorting/cocktail_sort.go b/sorting/cocktail_sort.go index f9814c3..2bf2f87 100644 --- a/sorting/cocktail_sort.go +++ b/sorting/cocktail_sort.go @@ -4,15 +4,7 @@ package main * Cocktail sort - https://en.wikipedia.org/wiki/Cocktail_sort */ -import "fmt" - -import "github.com/0xAX/go-algorithms" - -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - +func CocktailSort(arr []int) { tmp := 0 for i := 0; i < len(arr)/2; i++ { @@ -38,6 +30,5 @@ func main() { right-- } } - - fmt.Println("Sorted array is: ", arr) } + diff --git a/sorting/comb_sort.go b/sorting/comb_sort.go index 03987d7..f6a9720 100644 --- a/sorting/comb_sort.go +++ b/sorting/comb_sort.go @@ -4,15 +4,7 @@ package main * Comb sort - https://en.wikipedia.org/wiki/Combsort */ -import "fmt" - -import "github.com/0xAX/go-algorithms" - -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - +func CombSort(arr []int) { tmp := 0 arrLen := len(arr) gap := arrLen @@ -27,6 +19,4 @@ func main() { } } } - - fmt.Println("Sorted array is: ", arr) } diff --git a/sorting/counting_sort.go b/sorting/counting_sort.go index be735ca..b05f770 100644 --- a/sorting/counting_sort.go +++ b/sorting/counting_sort.go @@ -4,10 +4,6 @@ package main * Counting sort - https://en.wikipedia.org/wiki/Counting_sort */ -import "fmt" - -import "github.com/0xAX/go-algorithms" - func getK(arr []int) int { if len(arr) == 0 { return 1 @@ -24,14 +20,10 @@ func getK(arr []int) int { return k+1 } -func main(){ - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - +func CountingSort(arr []int) { k := getK(arr) array_of_counts := make([]int, k) - + for i:= 0; i < len(arr); i++ { array_of_counts[arr[i]] += 1 } @@ -47,6 +39,4 @@ func main(){ break } } - - fmt.Println("Sorted array is: ", arr) } diff --git a/sorting/gnome_sort.go b/sorting/gnome_sort.go index 1b63c6c..a7a6ba9 100644 --- a/sorting/gnome_sort.go +++ b/sorting/gnome_sort.go @@ -3,16 +3,7 @@ package main /* * Gnome sort - https://en.wikipedia.org/wiki/Gnome_sort */ - -import "fmt" - -import "github.com/0xAX/go-algorithms" - -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - +func GnomeSort(arr []int) { i := 1 tmp := 0 for ; i < len(arr) ; { @@ -28,7 +19,4 @@ func main() { } } } - - fmt.Println("Sorted array is: ", arr) } - diff --git a/sorting/heap_sort.go b/sorting/heap_sort.go index 4702d7e..62395ee 100644 --- a/sorting/heap_sort.go +++ b/sorting/heap_sort.go @@ -4,10 +4,6 @@ package main * Heap sort - https://en.wikipedia.org/wiki/Heapsort */ -import "fmt" - -import "github.com/0xAX/go-algorithms" - func sift(arr []int, i int, arrLen int) []int { done := false @@ -36,24 +32,18 @@ func sift(arr []int, i int, arrLen int) []int { return arr } -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - +func HeapSort(arr []int) { i := 0 tmp := 0 for i = len(arr) / 2 - 1; i >= 0; i-- { arr = sift(arr, i, len(arr)) } - + for i = len(arr) - 1; i >= 1; i-- { tmp = arr[0]; arr[0] = arr[i]; arr[i] = tmp; arr = sift(arr, 0, i); } - - fmt.Println("Sorted array is: ", arr) } diff --git a/sorting/insertion_sort.go b/sorting/insertion_sort.go index bea21ff..183941a 100644 --- a/sorting/insertion_sort.go +++ b/sorting/insertion_sort.go @@ -4,19 +4,7 @@ package main * Insertion sort - https://en.wikipedia.org/wiki/Insertion_sort */ -import "fmt" -import "github.com/0xAX/go-algorithms" - -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - - if len(arr) <= 1 { - fmt.Println("Sorted array is: ", arr) - return - } - +func InsertionSort(arr []int) { var i, j int for i = 1; i < len(arr); i++ { for j = 0; j < i; j++ { @@ -25,6 +13,4 @@ func main() { } } } - - fmt.Println("Sorted array is: ", arr) } diff --git a/sorting/merge_sort.go b/sorting/merge_sort.go index 5d848cc..7d8b30e 100644 --- a/sorting/merge_sort.go +++ b/sorting/merge_sort.go @@ -4,10 +4,6 @@ package main * Merge sort - http://en.wikipedia.org/wiki/Merge_sort */ -import "fmt" - -import "github.com/0xAX/go-algorithms" - func Merge(left, right []int) []int { result := make([]int, 0, len(left) + len(right)) @@ -42,11 +38,3 @@ func MergeSort(arr []int) []int { return Merge(left, right) } - -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - fmt.Println("Sorted array: ", MergeSort(arr)) -} - diff --git a/sorting/odd_even_sort.go b/sorting/odd_even_sort.go index 9e3f258..77ba67d 100644 --- a/sorting/odd_even_sort.go +++ b/sorting/odd_even_sort.go @@ -4,21 +4,13 @@ package main * Odd-Even sort - https://en.wikipedia.org/wiki/Odd-even_sort */ -import "fmt" - -import "github.com/0xAX/go-algorithms" - -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - +func OddEvenSort(arr []int) { tmp, isSorted := 0, false - for ; isSorted == false ; { - + for isSorted == false { + isSorted = true - + for i := 1; i < len(arr) - 1; i = i + 2 { if arr[i] > arr[i + 1] { tmp = arr[i] @@ -39,6 +31,4 @@ func main() { } } } - - fmt.Println("Sorted array is: ", arr) } diff --git a/sorting/quick_sort.go b/sorting/quick_sort.go index df32b8e..910f975 100644 --- a/sorting/quick_sort.go +++ b/sorting/quick_sort.go @@ -4,11 +4,8 @@ package main * Quick sort - https://en.wikipedia.org/wiki/Quicksort */ -import "fmt" import "math/rand" -import "github.com/0xAX/go-algorithms" - func quick_sort(arr []int) []int { if len(arr) <= 1 { @@ -41,9 +38,9 @@ func quick_sort(arr []int) []int { return low_part } -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - fmt.Println("Sorted array is: ", quick_sort(arr)) -} +//func main() { +// arr := utils.RandArray(10) +// fmt.Println("Initial array is:", arr) +// fmt.Println("") +// fmt.Println("Sorted array is: ", quick_sort(arr)) +//} diff --git a/sorting/selection_sort.go b/sorting/selection_sort.go index 42b19a6..b1e3e0c 100644 --- a/sorting/selection_sort.go +++ b/sorting/selection_sort.go @@ -4,15 +4,7 @@ package main * Selection sort - http://en.wikipedia.org/wiki/Selection_sort */ -import "fmt" - -import "github.com/0xAX/go-algorithms" - -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - +func SelectionSort(arr []int) { var min int = 0 var tmp int = 0 @@ -23,11 +15,9 @@ func main() { min = j } } - + tmp = arr[i] arr[i] = arr[min] arr[min] = tmp } - - fmt.Println("Sorted array: ", arr) } diff --git a/sorting/shell_sort.go b/sorting/shell_sort.go index 1b5dc35..46b94f8 100644 --- a/sorting/shell_sort.go +++ b/sorting/shell_sort.go @@ -3,23 +3,12 @@ package main /* * Shell sort - http://en.wikipedia.org/wiki/Shellsort */ - -import "fmt" - -import "github.com/0xAX/go-algorithms" - -func main() { - arr := utils.RandArray(10) - fmt.Println("Initial array is:", arr) - fmt.Println("") - - for d := int(len(arr)/2); d > 0; d /= 2 { - for i := d; i < len(arr); i++ { - for j := i; j >= d && arr[j-d] > arr[j]; j -= d { - arr[j], arr[j-d] = arr[j-d], arr[j] - } - } - } - - fmt.Println("Sorted array is: ", arr) -} \ No newline at end of file +func ShellSort(arr []int) { + for d := int(len(arr)/2); d > 0; d /= 2 { + for i := d; i < len(arr); i++ { + for j := i; j >= d && arr[j-d] > arr[j]; j -= d { + arr[j], arr[j-d] = arr[j-d], arr[j] + } + } + } +} diff --git a/sorting/sort.go b/sorting/sort.go new file mode 100644 index 0000000..c1fc419 --- /dev/null +++ b/sorting/sort.go @@ -0,0 +1,4 @@ +package main + +// @todo remove return +type Sort func([]int) diff --git a/sorting/sort_test.go b/sorting/sort_test.go new file mode 100644 index 0000000..3388347 --- /dev/null +++ b/sorting/sort_test.go @@ -0,0 +1,63 @@ +package main + +import ( + "testing" + + utils "github.com/0xAX/go-algorithms" +) + +var funcs = []struct{ + name string + f Sort +}{ + {"shell", ShellSort}, + {"selection", SelectionSort}, + {"oddeven", OddEvenSort}, + {"insertion", InsertionSort}, + {"heap", HeapSort}, + {"gnome", GnomeSort}, + {"counting", CountingSort}, + {"comb", CombSort}, + {"cocktail", CocktailSort}, + {"bubble", BubbleSort}, +} + +func TestSort(t *testing.T) { + for _, tt := range funcs { + t.Run(tt.name, func(t *testing.T) { + arr := utils.RandArray(10) + + tt.f(arr) + + if !isSorted(arr) { + t.Errorf("%v is not sorted", arr) + } + }) + } +} + +func BenchmarkSort(b *testing.B) { + for _, tt := range funcs { + arrs := make([][]int, 0) + + for n := 0; n < b.N; n++ { + arrs = append(arrs, utils.RandArray(10)) + } + + b.Run(tt.name, func(b *testing.B) { + for n := 0; n < len(arrs); n++ { + tt.f(arrs[n]) + } + }) + } +} + +func isSorted(arr []int) bool { + for i := 0; i < len(arr) - 1; i++ { + if arr[i] > arr[i + 1] { + return false + } + } + + return true +} From aa7200a1f1e78b859ebb00ceb0cbf3fa960ed363 Mon Sep 17 00:00:00 2001 From: decanus Date: Sun, 16 Feb 2020 18:03:44 +0100 Subject: [PATCH 2/2] using intsaresorted --- sorting/sort_test.go | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/sorting/sort_test.go b/sorting/sort_test.go index 3388347..0d51e6a 100644 --- a/sorting/sort_test.go +++ b/sorting/sort_test.go @@ -1,6 +1,7 @@ package main import ( + "sort" "testing" utils "github.com/0xAX/go-algorithms" @@ -29,7 +30,7 @@ func TestSort(t *testing.T) { tt.f(arr) - if !isSorted(arr) { + if !sort.IntsAreSorted(arr) { t.Errorf("%v is not sorted", arr) } }) @@ -51,13 +52,3 @@ func BenchmarkSort(b *testing.B) { }) } } - -func isSorted(arr []int) bool { - for i := 0; i < len(arr) - 1; i++ { - if arr[i] > arr[i + 1] { - return false - } - } - - return true -}