分布式与并行计算—并向算法实现

101 阅读1分钟

访问【WRITE-BUG数字空间】_[内附完整源码和文档]

原始串行快速排序算法中有“分而治之”的递归调用部分,在每次选择pivoit并把序列按照小于pivoIt和大于pivoit分成两类后,左右两部分的递归排序可以并发执行。

运行时间

  • 为了减小偶然性因素造成的时间差异,对每一个算法重复运行10000次,取平均耗时。
  • 考虑到“枚举排序”所需时间(O(n2)O(n^2))远远长于另外两者,因此“枚举排序”只运行一遍。
时间(毫秒)快速排序枚举排序归并排序
串行1.688922043.4941
并行0.86042771.5046

并行算法实现

快速排序

  • 原始串行快速排序算法中有“分而治之”的递归调用部分,在每次选择pivoit并把序列按照小于pivoIt大于pivoit分成两类后,左右两部分的递归排序可以并发执行,伪代码如下。
ParallelQucikSort(data, p, r)
	q = Partition(data, p, r) // partition会返回pivoit
	task[1] = ParallelQuickSort(data, p, q - 1)
	task[2] = ParallelQuickSort(data, q + 1, r)
    for j = 1 to 2 par-do
    	task[i]
    return data

枚举排序

  • 枚举排序原本会依次对每个元素进行计数的操作,我们可以使这些操作并行化,伪代码如下
ParallelEnumerateSort(data)
    sorted_data = new List
    for i = 1 to data.length par-do
        counter = 0
        for j = 1 to data.length do
            if data[j] < data[i]
                counter = counter + 1
        sorted_data[counter+1] = data[i]
    return sorted_data

归并排序

  • 归并排序的并行化改进与快速排序类似,都是在“分而治之”分完之后,对两个子任务并行执行,伪代码如下
ParallelMergeSort(data)
    if (data.length==1)
        return data
    else
        new_data[1] = data[:data.length/2]
        new_data[2] = data[data.length/2:]
        for i = 1 to 2 par-do
            ParallelMergeSort(new_data[i])
        
        data = MergeData(new_data[1],new_data[2])
        return data

0.png

1.jpg

2.jpg

3.jpg