目录
算法介绍
冒泡排序:是串行算法,在每次迭代过程中,每个元素可能与前面元素交换,也可能和后面的元素交换,数据的相关性比较强很难直接改成并行算法。
奇偶排序:或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算。这是与冒泡排序特点类似的一种比较排序。该算法中,排序过程分两个阶段,奇交换和偶交换,两种交换都是成对出现。对于奇交换,它总是比较奇数索引以及其相邻的后续元素。对偶交换,总是比较偶数索引和其相邻的后续元素。
可看出整个比较交换分为独立的奇阶段或偶阶段。在每个阶段内,所有的比较和交换没有数据相关性。因此,每一次比较和交换都可独立执行,也就可以并行化。
算法实现
import copy
import random
import time
import numpy as np
from mpi4py import MPI
N = 10000 # 待排元素个数
INF = 999999999 # 设置一个无穷大值
masterNode = 0 # 设置主进程标号
global myid # 进程标号
global part # 每个进程分配的元素个数
global sort # 用来表示排序是否完成的逻辑量
局部排序
这个阶段可以使用任意传统的排序算法,如冒泡排序,快速排序,局部奇偶排序等等,本文使用最简单的冒泡排序。
def odd_even_sort(array, num): # 冒泡排序
for i in range(num - 1):
isNotchange = True
for j in range(num - i - 1):
# print(array[j], j)
if array[j] > array[j + 1]:
array[j], array[j + 1] = array[j + 1], array[j]
isNotchange = False
if isNotchange == True:
break
# def odd_even_sort1(p, num): # 局部奇偶排序
# sort = 0
# while not sort: # 一次奇数排序和一次偶数排序均未发生数据交换时排序完成
# sort = 1
# for i in range(1, num, 2):
#