Skip to content

Instantly share code, notes, and snippets.

@tawfiknasser
Last active August 26, 2022 08:30
Show Gist options
  • Save tawfiknasser/d39853d00aab2587196365bfab628a4d to your computer and use it in GitHub Desktop.
Save tawfiknasser/d39853d00aab2587196365bfab628a4d to your computer and use it in GitHub Desktop.
Concurrent Merge Sort (Go)
/************
Concurrent Merge Sort
using goroutine and channel only
**************/
package main
import "fmt"
func Merge(left, right [] int) [] int{
merged := make([] int, 0, len(left) + len(right))
for len(left) > 0 || len(right) > 0{
if len(left) == 0 {
return append(merged,right...)
}else if len(right) == 0 {
return append(merged,left...)
}else if left[0] < right[0] {
merged = append(merged, left[0])
left = left[1:]
}else{
merged = append(merged, right [0])
right = right[1:]
}
}
return merged
}
func MergeSort(data [] int, channel chan [] int) {
defer close(channel) // clean up
if len(data) <= 1 {
channel <- data
return
}
mid := len(data)/2
left_channel := make(chan [] int)
right_channel := make(chan [] int)
go MergeSort(data[:mid],left_channel)
go MergeSort(data[mid:],right_channel)
left := <-left_channel // block unitl recieve
right := <-right_channel // block unitl recieve
channel <- Merge(left,right)
}
func main(){
data := [] int{9,4,3,6,1,2,10,5,7,8}
merge_channel := make(chan [] int) // on each sort call create a new channel
go MergeSort(data,merge_channel)
fmt.Printf("%v\n%v\n", data, <-merge_channel)
}
package main
import "fmt"
func Merge(left, right [] int) [] int{
merged := make([] int, 0, len(left) + len(right))
for len(left) > 0 || len(right) > 0{
if len(left) == 0 {
return append(merged,right...)
}else if len(right) == 0 {
return append(merged,left...)
}else if left[0] < right[0] {
merged = append(merged, left[0])
left = left[1:]
}else{
merged = append(merged, right [0])
right = right[1:]
}
}
return merged
}
func MergeSort(data [] int) [] int {
if len(data) <= 1 {
return data
}
done := make(chan bool)
mid := len(data)/2
var left [] int
go func(){
left = MergeSort(data[:mid])
done <- true
}()
right := MergeSort(data[mid:])
<-done
return Merge(left,right)
}
func main(){
data := [] int{9,4,3,6,1,2,10,5,7,8}
fmt.Printf("%v\n%v\n", data, MergeSort(data))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment