标签:
/* 本例拟在实现排序算法的归并算法,归并算法遵循分治法的思想 归并算法: 归并算法主要用来合并两个已经排好序的序列。用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; } }
标签:
原文地址:http://www.cnblogs.com/JTechER/p/4418671.html