美文网首页
多线程归并排序改进版

多线程归并排序改进版

作者: TimeMage | 来源:发表于2018-04-22 19:11 被阅读12次

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

代码

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

相关文章

  • 多线程归并排序改进版

    利用多线程归并有序集改进了下多线程排序,只剩下多线程拷贝没实现了。。。 代码 benchmark代码 测试结果

  • Java八大排序简述

    1.冒泡排序 改进版: 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.堆排序 7.归并排序 8.基数...

  • 多线程合并有序集

    在归并排序中,有个合并有序集操作。之前在用多线程实现归并排序中,并没将合并操作多线程化,导致并行度只有log(n)...

  • 从头开始复习算法之快速排序

    前面说到了三种简单的排序和归并排序,今天中午就开始来谈一谈我理解的快速排序。快速排序是前面冒泡排序的一个改进版本,...

  • 排序算法

    约定 选择排序 冒泡排序 插入排序 希尔排序 归并排序1. 归并方法2. 自顶向下归并排序3. 自底向上归并排序 ...

  • 排序二:归并、快排

    文章结构 归并排序 快速排序 源码 1. 归并排序 1.1 什么是归并排序 归并排序的思想是:将待排序的区间平分成...

  • java归并排序

    归并排序什么是归并排序:图解归并排序归并排序有两种实现方式,一是基于递归,而是基于迭代1)基于递归的归并排序: 基...

  • 多线程快速排序

    本文为大家介绍下快速排序算法的多线程写法。 按此逻辑也可以对归并排序进行改造,读者可先自行研究

  • 算法—排序篇2

    1、归并排序(Merging Sort) 归并排序(Merging Sort): 就是利用归并的思想实现排序⽅法....

  • 常见的排序算法(2)

    要点 快速排序 归并排序 1.快速排序 2.归并排序

网友评论

      本文标题:多线程归并排序改进版

      本文链接:https://www.haomeiwen.com/subject/owvclftx.html