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 );
}