mirror of
https://github.com/teivah/100-go-mistakes.git
synced 2026-06-21 00:47:11 +08:00
Reviews
This commit is contained in:
parent
f3f5d06bcf
commit
ab22488bb0
1 changed files with 45 additions and 37 deletions
|
|
@ -1,18 +1,54 @@
|
|||
package main
|
||||
|
||||
import "sync"
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
func sequentialMergesort(s []int) {
|
||||
if len(s) > 1 {
|
||||
middle := len(s) / 2
|
||||
sequentialMergesort(s[:middle])
|
||||
sequentialMergesort(s[middle:])
|
||||
merge(s, middle)
|
||||
if len(s) <= 1 {
|
||||
return
|
||||
}
|
||||
|
||||
middle := len(s) / 2
|
||||
sequentialMergesort(s[:middle])
|
||||
sequentialMergesort(s[middle:])
|
||||
merge(s, middle)
|
||||
}
|
||||
|
||||
func parallelMergesortV1(s []int) {
|
||||
if len(s) > 1 {
|
||||
if len(s) <= 1 {
|
||||
return
|
||||
}
|
||||
|
||||
middle := len(s) / 2
|
||||
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(2)
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
parallelMergesortV1(s[:middle])
|
||||
}()
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
parallelMergesortV1(s[middle:])
|
||||
}()
|
||||
|
||||
wg.Wait()
|
||||
merge(s, middle)
|
||||
}
|
||||
|
||||
const max = 2048
|
||||
|
||||
func parallelMergesortV2(s []int) {
|
||||
if len(s) <= 1 {
|
||||
return
|
||||
}
|
||||
|
||||
if len(s) <= max {
|
||||
sequentialMergesort(s)
|
||||
} else {
|
||||
middle := len(s) / 2
|
||||
|
||||
var wg sync.WaitGroup
|
||||
|
|
@ -20,12 +56,12 @@ func parallelMergesortV1(s []int) {
|
|||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
parallelMergesortV1(s[:middle])
|
||||
parallelMergesortV2(s[:middle])
|
||||
}()
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
parallelMergesortV1(s[middle:])
|
||||
parallelMergesortV2(s[middle:])
|
||||
}()
|
||||
|
||||
wg.Wait()
|
||||
|
|
@ -33,34 +69,6 @@ func parallelMergesortV1(s []int) {
|
|||
}
|
||||
}
|
||||
|
||||
const max = 2048
|
||||
|
||||
func parallelMergesortV2(s []int) {
|
||||
if len(s) > 1 {
|
||||
if len(s) <= max {
|
||||
sequentialMergesort(s)
|
||||
} else {
|
||||
middle := len(s) / 2
|
||||
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(2)
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
parallelMergesortV2(s[:middle])
|
||||
}()
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
parallelMergesortV2(s[middle:])
|
||||
}()
|
||||
|
||||
wg.Wait()
|
||||
merge(s, middle)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func merge(s []int, middle int) {
|
||||
helper := make([]int, len(s))
|
||||
copy(helper, s)
|
||||
|
|
|
|||
Loading…
Reference in a new issue