From 5b185638a83faae1a88c227cf21a5ace6ec88536 Mon Sep 17 00:00:00 2001 From: dimitrijjedich Date: Fri, 29 Nov 2024 08:13:31 +0100 Subject: [PATCH 1/8] initial commit --- algorithms/radix.go | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 algorithms/radix.go diff --git a/algorithms/radix.go b/algorithms/radix.go new file mode 100644 index 0000000..bb28749 --- /dev/null +++ b/algorithms/radix.go @@ -0,0 +1,5 @@ +package algorithms + +func RadixSort(arr []int) []int { + return arr +} From a77858220c451c31d8ab00b5da1f5d04e57fdfde Mon Sep 17 00:00:00 2001 From: dimitrijjedich Date: Fri, 29 Nov 2024 08:28:19 +0100 Subject: [PATCH 2/8] basic setup --- algorithms/radix.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/algorithms/radix.go b/algorithms/radix.go index bb28749..3ea7228 100644 --- a/algorithms/radix.go +++ b/algorithms/radix.go @@ -2,4 +2,7 @@ package algorithms func RadixSort(arr []int) []int { return arr + n := len(arr) + result := make([]int, n) + copy(result, arr) } From 7d788ea244322d7e34bcde4c2fff2cf1849070f8 Mon Sep 17 00:00:00 2001 From: dimitrijjedich Date: Fri, 29 Nov 2024 08:29:06 +0100 Subject: [PATCH 3/8] setup partitions --- algorithms/radix.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/algorithms/radix.go b/algorithms/radix.go index 3ea7228..266853c 100644 --- a/algorithms/radix.go +++ b/algorithms/radix.go @@ -5,4 +5,9 @@ func RadixSort(arr []int) []int { n := len(arr) result := make([]int, n) copy(result, arr) + + var partitions [10][]int + for i := range partitions { + partitions[i] = make([]int, 0) + } } From c9599f64aae1e590345d51a25ea89ca44453242d Mon Sep 17 00:00:00 2001 From: dimitrijjedich Date: Fri, 29 Nov 2024 08:31:24 +0100 Subject: [PATCH 4/8] add partitioning and collection logic for first iteration --- algorithms/radix.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/algorithms/radix.go b/algorithms/radix.go index 266853c..2e68159 100644 --- a/algorithms/radix.go +++ b/algorithms/radix.go @@ -10,4 +10,18 @@ func RadixSort(arr []int) []int { for i := range partitions { partitions[i] = make([]int, 0) } + divider := 10 + for { + if len(partitions[0]) == n { + return partitions[0] + } + for i := 0; i < n; i++ { + partition := result[i] % divider + partitions[partition] = append(partitions[partition], result[i]) + } + result = make([]int, 0) + for i := 0; i < 10; i++ { + result = append(result, partitions[i]...) + } + } } From 878740d16819a773abd6218914b87cd2156a7f2c Mon Sep 17 00:00:00 2001 From: dimitrijjedich Date: Fri, 29 Nov 2024 08:32:59 +0100 Subject: [PATCH 5/8] add handling of divider increment --- algorithms/radix.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/algorithms/radix.go b/algorithms/radix.go index 2e68159..9962388 100644 --- a/algorithms/radix.go +++ b/algorithms/radix.go @@ -16,12 +16,13 @@ func RadixSort(arr []int) []int { return partitions[0] } for i := 0; i < n; i++ { - partition := result[i] % divider + partition := (result[i] / divider) % divider partitions[partition] = append(partitions[partition], result[i]) } result = make([]int, 0) for i := 0; i < 10; i++ { result = append(result, partitions[i]...) } + divider = divider * 10 } } From 62577f564ff98791913a35a39f95e84b523f7b0b Mon Sep 17 00:00:00 2001 From: dimitrijjedich Date: Fri, 29 Nov 2024 08:33:12 +0100 Subject: [PATCH 6/8] remove initial return --- algorithms/radix.go | 1 - 1 file changed, 1 deletion(-) diff --git a/algorithms/radix.go b/algorithms/radix.go index 9962388..57d07cc 100644 --- a/algorithms/radix.go +++ b/algorithms/radix.go @@ -1,7 +1,6 @@ package algorithms func RadixSort(arr []int) []int { - return arr n := len(arr) result := make([]int, n) copy(result, arr) From f4761ea38cb2ffcb4189867d3f030bd09318446d Mon Sep 17 00:00:00 2001 From: dimitrijjedich Date: Fri, 29 Nov 2024 08:34:32 +0100 Subject: [PATCH 7/8] add tests for RadixSort --- algorithms_test/radix_test.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 algorithms_test/radix_test.go diff --git a/algorithms_test/radix_test.go b/algorithms_test/radix_test.go new file mode 100644 index 0000000..571fe78 --- /dev/null +++ b/algorithms_test/radix_test.go @@ -0,0 +1,33 @@ +package algorithms_test + +import ( + "github.com/dimitrijjedich/go-algorithms/algorithms" + "reflect" + "testing" +) + +func TestRadixSort(t *testing.T) { + testCases := []struct { + name string + input []int + expected []int + }{ + {"already sorted", []int{1, 2, 3, 4, 5}, []int{1, 2, 3, 4, 5}}, + {"reverse sorted", []int{5, 4, 3, 2, 1}, []int{1, 2, 3, 4, 5}}, + {"unsorted array", []int{5, 3, 8, 6, 2}, []int{2, 3, 5, 6, 8}}, + {"non consecutive array", []int{9, 3, 5, 1, 7}, []int{1, 3, 5, 7, 9}}, + {"empty array", []int{}, []int{}}, + {"single element", []int{42}, []int{42}}, + {"duplicates", []int{3, 1, 2, 3, 1}, []int{1, 1, 2, 3, 3}}, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + result := algorithms.RadixSort(testCase.input) + + if !reflect.DeepEqual(result, testCase.expected) { + t.Errorf("Failed %s: expected %v, got %v", testCase.name, testCase.expected, result) + } + }) + } +} From 9fcc204a0edb9f8049902ee96be53d1fb535695c Mon Sep 17 00:00:00 2001 From: dimitrijjedich Date: Fri, 29 Nov 2024 08:35:54 +0100 Subject: [PATCH 8/8] fix divider handling --- algorithms/radix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms/radix.go b/algorithms/radix.go index 57d07cc..d35d67e 100644 --- a/algorithms/radix.go +++ b/algorithms/radix.go @@ -15,7 +15,7 @@ func RadixSort(arr []int) []int { return partitions[0] } for i := 0; i < n; i++ { - partition := (result[i] / divider) % divider + partition := (result[i] / (divider / 10)) % divider partitions[partition] = append(partitions[partition], result[i]) } result = make([]int, 0)