奇偶融合排序的mpi4py实现

本文介绍了奇偶融合排序算法,并展示了如何使用MPI4Py将其并行化实现。算法通过奇偶阶段的独立比较和交换实现并行排序,最多进行n次排序即可使数据有序。文中详细阐述了局部排序、排序合并和奇偶融合的步骤,并提供了程序的运行结果和优化策略,如在未发生数据交换时跳出循环。
摘要由CSDN通过智能技术生成

目录

算法介绍

算法实现

局部排序

排序合并

奇偶融合

运行结果


算法介绍

冒泡排序:是串行算法,在每次迭代过程中,每个元素可能与前面元素交换,也可能和后面的元素交换,数据的相关性比较强很难直接改成并行算法。

奇偶排序:或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算。这是与冒泡排序特点类似的一种比较排序。该算法中,排序过程分两个阶段,奇交换和偶交换,两种交换都是成对出现。对于奇交换,它总是比较奇数索引以及其相邻的后续元素。对偶交换,总是比较偶数索引和其相邻的后续元素。

可看出整个比较交换分为独立的奇阶段或偶阶段。在每个阶段内,所有的比较和交换没有数据相关性。因此,每一次比较和交换都可独立执行,也就可以并行化。

算法实现

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):
#             
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值