实现归并排序的openmp程序_C语言:数据结构-归并排序

归并排序(Merging Sort)是基于两个有序序列归并的一种排序算法,设待排序的序列有n 个记录,这n个记录可以看成是n个有序序列,可以每两个一组,分别进行两个长度为1的有序序列的归并,称它为(1,1)归并,这样原序列就成为若干个长度为2的有序序列(当元素个数为奇数时也可能有长度为1的有序序列,程序将另行处理)。再把长度为2的相邻的子序列每两个一组,进行(2,2)归并,得到若干个长度为4的有序序列。(也可能有长度小于4的有序序列,程序另行处理),接着进行(4,4)归并•••最后得到排好序的长度为n的序列。称上述过程中的一次归并为一趟归并。

例如有一组记录的关键子序列(30,25,45,15,60,90,20,60),采用归并排序算法对其排序,排序过程如图9-7所示:

80bb49ff54520dd6288d6530d31c20ad.png

归并排序示例

一趟归并排序算法

/*把a[0],a[1],....,a[n-1]中的记录序列按关键字进行一趟归并,其中每个子序列长度为s的(s,s)归并,结果存入数组order中*/mergepass(NODE a[],NODE order[],int s,int n){ int i=0; while(i+2*s-1<=n-1) /*s为一趟归并中子序列的长度,在划分中只要够两个子序列就继续归并*/ { merge(a,i,i+s-1,i+2*s-1,order); /*i和i+s-1分别为第一个序列开始和终止下标,i+2*s-1为第二个序列的终止下标,进行两个 序列的归并*/ i=i+2*s; /*下一段两个子序列的起始下标*/ } if(i+s

在一趟归并排序算法的基础上,就能完成对长度为n的整个序列的归并排序,具体做法是逐次进行(1,1)、(2,2)、(4,4)等归并,最终得到长度为n的有序序列。值得注意的是在一趟归并排序算法中作为形式参数的两个数组,一个是原始数组a,另一个是一趟归并后的结果order,在调用时,如果相应于它们的实参分别是数组a1和a2,则下一趟归并要把a2作为原始数组,a1作为结果数组,这样交替使用。

归并排序算法

/*对存储在数组c1中,长度为n的记录序列按关键字进行归并排序,结果存放于数组c1中*/mergesort(NODE c1[],int n){ int i,s=1; /*s中存放每一趟两两归并时,每个子序列的长度*/ NODE c2[MAX]; /*MAX表示数组c2有足够大的长度,数组c1,c2轮换着作为原始 序列和一趟归并后的结果序列*/ while(s

归并排序的时间复杂度是O(nlog2n),是一种稳定的排序方法。

例:已知序列{10,18,4,3,6,12,1,9,15,8},给出用归并排序法对序列作升序排列时的每一趟结果(n为偶数)。

初始:10,18,4,3,6,12,1,9,15,8

[10,18] [3,4 ] [6,12] [1,9 ] [8,15]

[3,4,10,18] [1,6,9,12] [8,15]

最后只剩下长度<= s的一个子序列

[1,3,4,6,9,10,12,18] [8,15]

两个子序列中只有一个长度不足

[1,3,4,6,8,9,12,15,18]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值