Skip to content

Commit e0c3c17

Browse files
committed
Merge branch 'mattany-master'
Fix merge conflicts. Modify new file for insertion sort and delete old file.
2 parents 198afff + 2ee1d70 commit e0c3c17

File tree

8 files changed

+165
-114
lines changed

8 files changed

+165
-114
lines changed

sorts/heap_sort.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func (h maxHeap) MaxHeapify(i int) {
3333

3434
func (h maxHeap) size() int { return h.heapSize } // ???
3535

36-
func heapSort(slice []int) []int {
36+
func HeapSort(slice []int) []int {
3737
h := buildMaxHeap(slice)
3838
//log.Println(slice)
3939
for i := len(h.slice) - 1; i >= 1; i-- {

sorts/insertionsort.go renamed to sorts/insertion_sort.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
// Reference: https://en.wikipedia.org/wiki/Insertion_sort
2-
1+
//Package sorts a package for demonstrating sorting algorithms in Go
32
package sorts
43

5-
func insertionSort(arr []int) []int {
4+
func InsertionSort(arr []int) []int {
65
for currentIndex := 1; currentIndex < len(arr); currentIndex++ {
76
temporary := arr[currentIndex]
87
iterator := currentIndex

sorts/quick_sort.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"math/rand"
66
)
77

8-
func quickSort(arr []int) []int {
8+
func QuickSort(arr []int) []int {
99

1010
if len(arr) <= 1 {
1111
return arr
@@ -28,8 +28,8 @@ func quickSort(arr []int) []int {
2828
}
2929
}
3030

31-
lowPart = quickSort(lowPart)
32-
highPart = quickSort(highPart)
31+
lowPart = QuickSort(lowPart)
32+
highPart = QuickSort(highPart)
3333

3434
lowPart = append(lowPart, middlePart...)
3535
lowPart = append(lowPart, highPart...)

sorts/radix_sort.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package sorts
2+
3+
func max(arr []int) int {
4+
max := arr[0]
5+
for _, item := range arr {
6+
if item > max {
7+
max = item
8+
}
9+
}
10+
return max
11+
}
12+
13+
func countSort(arr []int, exp int) []int {
14+
var digits [10]int
15+
var output = make([]int, len(arr))
16+
17+
for _, item := range arr {
18+
digits[(item/exp)%10]++
19+
}
20+
for i := 1; i < 10; i++ {
21+
digits[i] += digits[i-1]
22+
}
23+
24+
for i := len(arr) - 1; i >= 0; i-- {
25+
output[digits[(arr[i]/exp)%10]-1] = arr[i]
26+
digits[(arr[i]/exp)%10]--
27+
}
28+
29+
return output
30+
}
31+
32+
func unsignedRadixSort(arr []int) []int {
33+
if len(arr) == 0 {
34+
return arr
35+
}
36+
maxElement := max(arr)
37+
for exp := 1; maxElement/exp > 0; exp *= 10 {
38+
arr = countSort(arr, exp)
39+
}
40+
return arr
41+
}
42+
43+
func RadixSort(arr []int) []int {
44+
var negatives, nonNegatives []int
45+
46+
for _, item := range arr {
47+
if item < 0 {
48+
negatives = append(negatives, -item)
49+
} else {
50+
nonNegatives = append(nonNegatives, item)
51+
}
52+
}
53+
negatives = unsignedRadixSort(negatives)
54+
55+
// Reverse the negative array and restore signs
56+
for i, j := 0, len(negatives)-1; i <= j; i, j = i+1, j-1 {
57+
negatives[i], negatives[j] = -negatives[j], -negatives[i]
58+
}
59+
return append(negatives, unsignedRadixSort(nonNegatives)...)
60+
}

sorts/selection_sort.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//Package sorts a package for demonstrating sorting algorithms in Go
22
package sorts
33

4-
func selectionSort(arr []int) []int {
4+
func SelectionSort(arr []int) []int {
55

66
for i := 0; i < len(arr); i++ {
77
min := i

sorts/shell_sort.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//Package sorts a package for demonstrating sorting algorithms in Go
22
package sorts
33

4-
func shellSort(arr []int) []int {
4+
func ShellSort(arr []int) []int {
55
for d := int(len(arr) / 2); d > 0; d /= 2 {
66
for i := d; i < len(arr); i++ {
77
for j := i; j >= d && arr[j-d] > arr[j]; j -= d {

sorts/sorts_case_test.go

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,45 @@ type sortTest struct {
1313
name string
1414
}
1515

16-
var arr []int = makeRandArray(500_000)
16+
var uarr []int = makeRandomUnsignedSlice(500_000)
17+
var arr []int = makeRandomSignedSlice(500_000)
1718

1819
var sortTests = []sortTest{
1920
//Sorted slice
2021
{[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
21-
[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "Sorted"},
22+
[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "Sorted Unsigned"},
2223
//Reversed slice
2324
{[]int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1},
24-
[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "Reversed"},
25+
[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "Reversed Unsigned"},
26+
//500k unsigned int values sort
27+
{uarr, getSortedVersion(uarr), "Large Random Unsigned"},
28+
29+
//Sorted slice
30+
{[]int{-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
31+
[]int{-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "Sorted Signed"},
32+
33+
//Reversed slice
34+
{[]int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10},
35+
[]int{-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "Reversed Signed"},
36+
37+
//Reversed slice, even length
38+
{[]int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10},
39+
[]int{-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "Reversed Signed #2"},
40+
41+
//Random order with repetitions
42+
{[]int{-5, 7, 4, -2, 6, 5, 8, 3, 2, -7, -1, 0, -3, 9, -6, -4, 10, 9, 1, -8, -9, -10},
43+
[]int{-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10}, "Random order Signed"},
44+
45+
//500k int values sort
46+
{arr, getSortedVersion(arr), "Large Random Signed"},
47+
2548
//Empty slice
2649
{[]int{}, []int{}, "Empty"},
2750
//Single-entry slice
2851
{[]int{1}, []int{1}, "Singleton"},
29-
30-
//500k values sort
31-
{arr, getSortedVersion(arr), "Large Random"},
3252
}
3353

34-
func makeRandArray(size int) []int {
54+
func makeRandomUnsignedSlice(size int) []int {
3555
vals := make([]int, size)
3656
for i := 0; i < size; i++ {
3757
temp, _ := rand.Int(rand.Reader, big.NewInt(int64(size)))
@@ -40,6 +60,15 @@ func makeRandArray(size int) []int {
4060
return vals
4161
}
4262

63+
func makeRandomSignedSlice(size int) []int {
64+
vals := make([]int, size)
65+
for i := 0; i < size; i++ {
66+
temp, _ := rand.Int(rand.Reader, big.NewInt(int64(size)))
67+
vals[i] = int(temp.Int64()) - 250_000
68+
}
69+
return vals
70+
}
71+
4372
func getSortedVersion(a []int) []int {
4473
sort.Slice(a, func(i, j int) bool { return a[i] < a[j] })
4574
return a

0 commit comments

Comments
 (0)