归并排序以及基于ForkJoin框架实现的并行归并排序(使用RecursiveAction)

本文介绍了归并排序的原理,并通过代码示例展示了如何实现基于ForkJoin框架的并行归并排序,以提高排序效率。讨论了线程同步和内存管理的问题,最终展示了一个使用ForkJoinPool的高效并行排序实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 首先理解归并排序的实现过程:

我想大家肯定都了解过归并排序,那些文字描述包括分治法我就不复制粘贴了,我这里以图的方式给出它的原理

重要点:

(1):假设a数组存储待排序数组,在合并数组时避免不了改变数组内的值,所以需要一个t数组暂时保存中间结果,举个例子:在合并数组为【5,4】时,合并的结果应该是【4,5】,先将结果保存在t里面(因为中间不是简单的交换,可能还包含多个步骤),最后再用t数组中的【4,5】替换掉a数组中的【5,4】;

(2):所说的合并到底指的是什么?

合并指的是将一个数组中的两个连在一起的子数组按照原先的下标有序的组合在一起,举个例子:此时数组为5 4 3 2 1,假设现在要合并子数组为【0,0】和【1,1】,那么合并完成后就是4 5 3 2 1;

如何实现合并?(下面的代码拿着笔随便举个例子run一遍就会明白了,这也是合并排序的核心

void Merge(int c[], int d[], int l, int m, int r){		//合并两个连续的子数组
	int i = l, j = m+1, k = l ;

	while ( ((i<=m) && (j<=r)) ){
		if( c[i]<c[j] )
			d[k++] = c[i++] ;
		else 
			d[k++] = c[j++] ;
	}
	while(i<=m)    //若是前半段子数组有剩余就加在总数组后面
		d[k++] = c[i++];
	while(j<=r)    //若是后半段子数组有剩余就加在总数组后面
		d[k++] = c[j++];
}

剩下的代码其实都很简单了:

先是递归程序:

void mergeSort(int a[], int left, int right){
	int s ;
	if(left < right){

		int i = (left+right)/2 ;

		mergeSort(a, left, i) ;
		mergeSort(a, i+1, right) ;
		
		Merge(a, d, left, i, right) ;    //d数组是全局变量
		
		Copy(a, d, left, right) ;		
	}
}

然后每当合并后执行Copy:

void Copy(int a[],int b[],int left,int right){    //将a数组的[low, right]段替换成b段的,其余保持不
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值