访问【WRITE-BUG数字空间】_[内附完整源码和文档]
原始串行快速排序算法中有“分而治之”的递归调用部分,在每次选择pivoit并把序列按照小于pivoIt和大于pivoit分成两类后,左右两部分的递归排序可以并发执行。
运行时间
为了减小偶然性因素造成的时间差异,对每一个算法重复运行10000次,取平均耗时。
考虑到“枚举排序”所需时间(
O
(
n
2
)
O(n^2)
O(n2))远远长于另外两者,因此“枚举排序”只运行一遍。
时间(毫秒) 快速排序 枚举排序 归并排序
串行 1.6889 2204 3.4941
并行 0.8604 277 1.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![在这里插入图片描述](https://img-blog.csdnimg.cn/36d024dc46714d4f815666da03b049b6.jpeg#pic_center)