/*
本例拟在实现排序算法的归并算法,归并算法遵循分治法的思想
归并算法:
归并算法主要用来合并两个已经排好序的序列。用Merge(A,p,q,r)来实现合并,
其中A代表数组,A[p,q]和A[q+1,r]A的两个子数组,且两个数组都已经排好序,归并算法
就是将这两个子数组合并成一个排好序的数组并替代当前的数组A[p,r]。
*/
public class Merge
{
public static void main(String[] args)
{
int[] a = {1,2,3,4,5,7,9,11,6,8,10,12,13,14,15,16};
merge(a,4,7,11);
for(int i=0; i<a.length; i++)
{
System.out.print(a[i]);
}
}
public static int[] merge(int[] a, int leftStart, int leftEnd, int rightEnd)
{
int left_length = leftEnd - leftStart + 1; //左数组的长度
int right_length = rightEnd - leftEnd; //右数组的长度
int[] left = new int[left_length + 1]; //构建左数组的副本,长度加1,用来存放标志牌
int[] right = new int[right_length + 1]; //构建右数组的副本,长度加1,用来存放标志牌
for(int i=0; i<left_length; i++)
{
left[i] = a[leftStart + i]; //往左数组的副本里拷贝数据
}
for(int i=0; i<right_length; i++)
{
right[i] = a[leftEnd + i + 1]; //往右数组的副本里拷贝数据
}
left[left_length ] = 10000; //左数组最后一个数放一个大数,用作结束的标志
right[right_length ] = 10000; //右数组的最后一个数放一个大数,用作结束的标志
int i=0; //初始化左右两个数组的下标
int j=0;
/*
从数组的leftStart到rightEnd区间内开始循环比较左右两个数组内数值的大小
如果左数组的某个值小,就把值放入对应的a数组内,左数组的数组下标加1
如果右数组的某个值小,就把值放入对应的a数组内,右数组的数组下标加1
*/
for(int k=leftStart; k<rightEnd; k++)
{
if(left[i] < right[j])
{
a[k] = left[i];
i = i + 1;
}else
{
a[k] = right[j];
j = j + 1;
}
}
return a;
}
}