多线程归并排序改进版

利用多线程归并有序集改进了下多线程排序,只剩下多线程拷贝没实现了。。。

代码

package multisortex

func binsearch(x int, a []int) int {
    var l, r = 0, len(a)
    for l < r {
        mid := (l + r) / 2
        if a[mid] >= x {
            r = mid
        } else {
            l = mid + 1
        }
    }
    return l
}
func normmerge(a []int, b []int, c []int) {
    var i, j, k = 0, 0, 0
    for i < len(a) || j < len(b) {
        if i < len(a) && j < len(b) {
            if a[i] <= b[j] {
                c[k] = a[i]
                i++
            } else {
                c[k] = b[j]
                j++
            }
        } else if i < len(a) {
            c[k] = a[i]
            i++
        } else {
            c[k] = b[j]
            j++
        }
        k++
    }
}
func pmerge(a []int, b []int, c []int, ch chan int, td int) {
    if td == 1 {
        normmerge(a, b, c)
    } else if len(b) == 0 {
        copy(c, a)
    } else if len(a) == 0 {
        copy(c, b)
    } else {
        var sed = make(chan int)
        var mid = len(a) / 2
        var pos = binsearch(a[mid], b)
        c[mid+pos] = a[mid]
        go pmerge(a[:mid], b[:pos], c[:mid+pos], sed, td>>1)
        pmerge(a[mid+1:], b[pos:], c[mid+pos+1:], nil, td>>1)
        <-sed
    }
    if ch != nil {
        close(ch)
    }
}

func mergesortT(arr, buff []int) {
    n := len(arr)
    x, y := arr, buff
    i, j, k := 0, 0, 0
    for i = 1; i < n; i <<= 1 {
        for j = 0; j < n-i; j = k {
            k = j + 2*i
            if k > n {
                k = n
            }
            normmerge(x[j:j+i], x[j+i:k], y[j:k])
        }
        x, y = y, x
    }
    if &x[0] != &arr[0] {
        copy(arr, x)
    }
}
func mergesort(arr, buff []int, sed chan int, level int) {
    n := len(arr)
    if n <= 2 || level == 1 {
        mergesortT(arr, buff)
    } else {
        recv := make(chan int)
        mid := n >> 1
        go mergesort(arr[:mid], buff[0:mid], recv, level>>1)
        mergesort(arr[mid:], buff[mid:], nil, level>>1)
        <-recv
        pmerge(arr[:mid], arr[mid:], buff, nil, level)
        copy(arr, buff)
    }
    if sed != nil {
        close(sed)
    }
}

func MergeSort(arr []int, t int) {
    buff := make([]int, len(arr))
    mergesort(arr, buff, nil, t)
}

benchmark代码

package multisortex

import (
    "math/rand"
    "testing"
)

func BenchmarkT1(b *testing.B) {
    b.N = 4
    b.StopTimer()
    n := 1 << 24
    arr := make([]int, n)
    b.StartTimer()
    for i := 0; i < b.N; i++ {
        b.StopTimer()

        for i := 0; i < n; i++ {
            arr[i] = rand.Intn(n)
        }
        b.StartTimer()
        MergeSort(arr, 1)
    }
}
func BenchmarkT2(b *testing.B) {
    b.N = 4
    b.StopTimer()
    n := 1 << 24
    arr := make([]int, n)
    b.StartTimer()
    for i := 0; i < b.N; i++ {
        b.StopTimer()
        for i := 0; i < n; i++ {
            arr[i] = rand.Intn(n)
        }
        b.StartTimer()
        MergeSort(arr, 2)
    }
}
func BenchmarkT4(b *testing.B) {
    b.N = 4
    b.StopTimer()
    n := 1 << 24
    arr := make([]int, n)
    b.StartTimer()
    for i := 0; i < b.N; i++ {
        b.StopTimer()
        for i := 0; i < n; i++ {
            arr[i] = rand.Intn(n)
        }
        b.StartTimer()
        MergeSort(arr, 4)
    }
}
func BenchmarkT8(b *testing.B) {
    b.N = 4
    b.StopTimer()
    n := 1 << 24
    arr := make([]int, n)
    b.StartTimer()
    for i := 0; i < b.N; i++ {
        b.StopTimer()

        for i := 0; i < n; i++ {
            arr[i] = rand.Intn(n)
        }
        b.StartTimer()
        MergeSort(arr, 8)
    }
}

测试结果

goos: windows
goarch: amd64
pkg: sort/multisortex
BenchmarkT1-4                  4        2315135000 ns/op
BenchmarkT2-4                  4        1271903875 ns/op
BenchmarkT4-4                  4        1079014875 ns/op
BenchmarkT8-4                  4         914900250 ns/op
PASS
ok      sort/multisortex        30.314s

goos: windows
goarch: amd64
pkg: sort/multisort
BenchmarkT1-4                  4        2367175725 ns/op
BenchmarkT2-4                  4        1327192850 ns/op
BenchmarkT4-4                  4        1212362200 ns/op
BenchmarkT8-4                  4        1074262700 ns/op
PASS
ok      sort/multisort  31.924s
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,526评论 25 709
  • 一. 写在前面 要学习算法,“排序”是一个回避不了的重要话题,在分析完并查集算法和常用数据结构之后,今天我们终于可...
    Leesper阅读 7,278评论 0 40
  • 我喜欢喝点小酒,啤酒、红酒、黄酒、威士忌…基本上只要不是白酒我都可以独酌几口。这个习惯好像是从大学开始的。那个精力...
    白大炮阅读 2,790评论 0 0
  • 什么是所谓的有层次感的PPT 我在标题里用的是「有层次感的PPT」,这个说法可能对大家来说更容易理解,但是层次感只...
    伯健君PPT阅读 9,523评论 3 32
  • 018.04.02 13:05 打开App 今天中午我写了几个字 分别是 大家一起走进学校, 一起快乐的玩,一起在...
    明月_ca56阅读 472评论 0 0