mirror of
https://github.com/teivah/100-go-mistakes.git
synced 2026-06-25 10:56:52 +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
|
package main
|
||||||
|
|
||||||
import "sync"
|
import (
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
func sequentialMergesort(s []int) {
|
func sequentialMergesort(s []int) {
|
||||||
if len(s) > 1 {
|
if len(s) <= 1 {
|
||||||
middle := len(s) / 2
|
return
|
||||||
sequentialMergesort(s[:middle])
|
|
||||||
sequentialMergesort(s[middle:])
|
|
||||||
merge(s, middle)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
middle := len(s) / 2
|
||||||
|
sequentialMergesort(s[:middle])
|
||||||
|
sequentialMergesort(s[middle:])
|
||||||
|
merge(s, middle)
|
||||||
}
|
}
|
||||||
|
|
||||||
func parallelMergesortV1(s []int) {
|
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
|
middle := len(s) / 2
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
|
@ -20,12 +56,12 @@ func parallelMergesortV1(s []int) {
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
parallelMergesortV1(s[:middle])
|
parallelMergesortV2(s[:middle])
|
||||||
}()
|
}()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
parallelMergesortV1(s[middle:])
|
parallelMergesortV2(s[middle:])
|
||||||
}()
|
}()
|
||||||
|
|
||||||
wg.Wait()
|
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) {
|
func merge(s []int, middle int) {
|
||||||
helper := make([]int, len(s))
|
helper := make([]int, len(s))
|
||||||
copy(helper, s)
|
copy(helper, s)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue