设计算法之分治法(补充)

1.算法说明

在设计算法之分治法的博客中,笔者已经写出了一个分治算法,不过那个算法笔者用了个哨兵,L[n1 + 1] = ∞ 和R[n2 + 1]= ∞。现在,我们想要实现的是,不用这个哨兵,那么这个算法该么写呢?本次博文将会给出。

2.不用哨兵的分治算法 

MERGE2(A,p,q,r)
  n1 = q – p + 1
  n2 = r – q
  Let[1…n1+1] and R[1…n2+1] be new arrays
  for i = 1 to n1
L[i] = A[p + i - 1]
  for j = 1 to n2
R[j] = A[q + j]
  i = 1
  j = 1
  for k = p to r
if i < n1 and j < n2
  if L[i] <= R[j]
    A[k] = L[i]
    i = i + 1
    continue
  else A[k] = R[j]
    j = j + 1
    continue
if i >= n1 and j < n2
  A[k] = R[j]
  j = j + 1
  continue
if i < n1 and j >= n2
  A[k] = L[i]
  i = i + 1
continue

3. java实现分治算法

public int[] merge2(int[] array, int p, int q, int r)
	{
		int n1 = q - p + 1;
		int n2 = r - q;
		Integer [] lArray = new Integer[n1];
		Integer [] rArray = new Integer[n2];
		
		for(int i = 0; i < n1; i++)
		{
			lArray[i] = array[p + i ];
		}
		
		for(int j = 0; j < n2; j++)
		{
			rArray[j] = array[q + j +1];
		}
		
		
		
		int i = 0;
		int j =0;
		for(int k = p; k <= r; k++)
		{
			if (i < n1 && j < n2)
			{
				if (lArray[i] <= rArray[j])
				{
					array[k] = lArray[i];
					i = i + 1;
					continue;
				}
				else 
				{
					array[k] = rArray[j];
					j = j + 1;
					continue;
				}
			}
			
			if (i >= n1 && j < n2)
			{
				array[k] = rArray[j];
				j = j + 1;
				continue;
			}
			
			if (i < n1 && j >= n2)
			{
				array[k] = lArray[i];
				i = i + 1;
				continue;
			}
			
			
		}
		
		return array;
	}

使用Junit测试
 @Test
	public void testMerge2()
	{
		DivideAndConquer dac = new DivideAndConquer();
		int[] a = {2, 4, 5, 7, 1, 2, 3, 6};
		int[] resultA  = {1, 2, 2, 3, 4, 5, 6, 7 };
		assertArrayEquals(dac.merge2(a,0,3,7), resultA );
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值