-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsortingCon.go
117 lines (112 loc) · 2.11 KB
/
sortingCon.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package main
import (
"fmt"
"math"
"sync"
)
func getMinimum(sli []int) int {
min := sli[0]
minIndex := 0
for i := 0; i < len(sli); i++ {
if sli[i] < min {
min = sli[i]
minIndex = i
}
}
return minIndex
}
func sortPartition(sli []int, wg *sync.WaitGroup) {
for i := 0; i < len(sli)-1; i++ {
min := getMinimum(sli[i:len(sli)])
sli[i], sli[i+min] = sli[i+min], sli[i]
}
fmt.Println("Sorted Partition:", sli)
wg.Done()
}
func merge(sli []int, wg *sync.WaitGroup) []int {
n := len(sli)
a := sli[0:r1]
b := sli[r1:r2]
c := sli[r2:r3]
d := sli[r3:n]
sortedSli := make([]int, 0, n)
ai, bi, ci, di := 0, 0, 0, 0
for ai+bi+ci+di < len(sli) {
elem := make([]int, 0, 4)
if ai < len(a) {
elem = append(elem, a[ai])
} else {
elem = append(elem, 2147483647)
}
if bi < len(b) {
elem = append(elem, b[bi])
} else {
elem = append(elem, 2147483647)
}
if ci < len(c) {
elem = append(elem, c[ci])
} else {
elem = append(elem, 2147483647)
}
if di < len(d) {
elem = append(elem, d[di])
} else {
elem = append(elem, 2147483647)
}
switch getMinimum(elem) {
case 0:
{
sortedSli = append(sortedSli, a[ai])
ai++
}
case 1:
{
sortedSli = append(sortedSli, b[bi])
bi++
}
case 2:
{
sortedSli = append(sortedSli, c[ci])
ci++
}
case 3:
{
sortedSli = append(sortedSli, d[di])
di++
}
default:
{
break
}
}
}
return (sortedSli)
}
//partitions parameter
var r1, r2, r3 = 0, 0, 0
func main() {
var n int
fmt.Println("Enter total number you want to enter: ")
fmt.Scan(&n)
sli := make([]int, n, n)
for i := 0; i < n; i++ {
fmt.Scan(&sli[i])
}
fmt.Println("Unsorted list: ", sli, "\n")
//Partition parameters
r1 = int(math.Round(float64(n)/4.0)) * 1
r2 = int(math.Round(float64(n)/4.0)) * 2
r3 = int(math.Round(float64(n)/4.0)) * 3
if r3 > n {
r3--
}
var wg sync.WaitGroup
wg.Add(4)
go sortPartition(sli[0:r1], &wg)
go sortPartition(sli[r1:r2], &wg)
go sortPartition(sli[r2:r3], &wg)
go sortPartition(sli[r3:n], &wg)
wg.Wait()
SortedSlice := merge(sli, &wg)
fmt.Println("\nSorted list:", SortedSlice)
}