美文网首页
多线程归并排序 go实现

多线程归并排序 go实现

作者: TimeMage | 来源:发表于2018-02-09 15:49 被阅读32次

特性

  • 线程数可以调整
  • 混合使用归并排序的递归版和非递归版实现减少递归调用损耗
  • 线程利用率高
  • 不足:归并排序的merge部分,任务无法分摊,没有充分利用

1000万的随机数

  • 递归版时间

    real    0m3.037s
    user    0m2.859s
    sys     0m0.125s
    
  • 单线程

      BenchmarkT1-4             10    2718827530 ns/op    268435456 B/op         2 allocs/op
    
  • 双线程

      BenchmarkT2-4             10    1783577760 ns/op    268435792 B/op         4 allocs/op
    
  • 四线程

      BenchmarkT4-4             10    1692288480 ns/op    268436278 B/op         7 allocs/op
    

代码

package main

func merge(x, y, out []int) {
    n, m := len(x), len(y)
    for i, j, k := 0, 0, 0; k < n+m; k++ {
        if i < n && j < m {
            if x[i] < y[j] {
                out[k] = x[i]
                i++
            } else {
                out[k] = y[j]
                j++
            }
        } else {
            if i < n {
                out[k] = x[i]
                i++
            } else {
                out[k] = y[j]
                j++
            }
        }
    }
}
func min(x, y int) int {
    if x < y {
        return x
    }
    return y
}
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 = min(n, j+2*i)
            merge(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)
        if sed != nil {
            sed <- 0
        }
        return
    }
    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
    merge(arr[:mid], arr[mid:], buff)
    copy(arr, buff)
    if sed != nil {
        sed <- 0
    }
}

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

相关文章

  • 多线程归并排序 go实现

    特性 线程数可以调整 混合使用归并排序的递归版和非递归版实现减少递归调用损耗 线程利用率高 不足:归并排序的mer...

  • 多线程合并有序集

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

  • 多线程归并排序改进版

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

  • 算法—排序篇2

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

  • 归并排序&快速排序

    归并排序 利用归并的思想实现排序方法,该算法采用经典的分治策略,分而治之。 代码实现 基础设置 归并排序 —— 非...

  • go之sort

    正如sort的含义,go的sort包提供排序的能力,其内部实现了堆排、快排、插入排序、希尔排序和归并排序,而且针对...

  • 算法

    分类 排序 希尔排序 代码实现 归并排序 代码实现 查找

  • java归并排序

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

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • JavaScript实现排序算法

    实现了冒泡,选择,插入,快排,希尔,归并 冒泡排序 选择排序 插入排序 快速排序 希尔排序 归并排序

网友评论

      本文标题:多线程归并排序 go实现

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