diff --git a/go/05-concurrency/deadlock.go b/go/05-concurrency/deadlock.go new file mode 100644 index 0000000..931c201 --- /dev/null +++ b/go/05-concurrency/deadlock.go @@ -0,0 +1,17 @@ +package main + +func print(ci <-chan int) { + //TODO: implement +} + +func main() { + + c := make(chan int) + + c <- 1 + c <- 2 + c <- 3 + close(c) + + print(c) +} diff --git a/go/05-concurrency/mergeSort.go b/go/05-concurrency/mergeSort.go new file mode 100644 index 0000000..4160246 --- /dev/null +++ b/go/05-concurrency/mergeSort.go @@ -0,0 +1,86 @@ +package main + +import ( + "fmt" + "math/rand" + "sort" + "time" +) + +func mergeSortSequential(data []float64) { + if len(data) <= 1 { + return + } + + mid := len(data) / 2 + left := data[:mid] + right := data[mid:] + + mergeSortSequential(left) + mergeSortSequential(right) + + copy(data, merge(left, right)) +} + +func merge(left, right []float64) []float64 { + result := make([]float64, 0, len(left)+len(right)) + i, j := 0, 0 + + for i < len(left) && j < len(right) { + if left[i] < right[j] { + result = append(result, left[i]) + i++ + } else { + result = append(result, right[j]) + j++ + } + } + + result = append(result, left[i:]...) + result = append(result, right[j:]...) + + return result +} + +func main() { + + //1. DATA CREATION + data := make([]float64, 1000*1000*20) + + for i := range data { + data[i] = rand.Float64() * 100 // Random floats between 0 and 100 + } + + expected := make([]float64, len(data)) + copy(expected, data) + sort.Float64s(expected) + + //2. SORTING + start := time.Now() + + mergeSortSequential(data) + + elapsed := time.Since(start) + fmt.Printf("MergeSort took %s\n", elapsed) + + //3. VERIFICATION + if sort.Float64sAreSorted(data) { + fmt.Println("Data is sorted correctly") + } else { + fmt.Println("Data is NOT sorted correctly") + } + + if len(data) != len(expected) { + fmt.Println("Data and expected slices have different lengths") + return + } + + for i := range data { + if data[i] != expected[i] { + fmt.Println("Data and expected slices do not match") + return + } + } + + fmt.Println("Data and expected slices match") +} diff --git a/go/05-concurrency/select.go b/go/05-concurrency/select.go new file mode 100644 index 0000000..8af6e52 --- /dev/null +++ b/go/05-concurrency/select.go @@ -0,0 +1,19 @@ +package main + +import ( + "math/rand" + "time" +) + +func main() { + + ch1 := make(chan string) + + go func() { + time.Sleep(time.Duration(rand.Intn(5)+1) * time.Second) + ch1 <- "Message from channel 1" + }() + + msg1 := <-ch1 + println("Received:", msg1) +}