这里是二路归并排序算法的普通实现:
package GB; /** * * @author YuYunTan(谭淇蔚) *这里是算法,归并排序,这是二路归并排序算法 *分治策略的思想: *任一实例 *I = (n,A[1],...,A[n])分成两个这样的实例 *I1 = ([n/2],A[1],...,A([n/2]))和 *I2 = ([n/2],A[[n/2]+1],...,A(n)) *分别对每个集合单独排序,然后将已排序的两个序列归并成一个含n个元素的分好类的序列 * *这种思想是典型的分治设计思想,归并排序也叫做分治合并排序 * *算法如下: *procedure MERGESORT(low,high) *global A[1...n] *if(low < high) * then mid = (low+high)/2;//求这个集合的分隔点 * { * MERGESORT(low,mid);//将这个子集合排序 * MERGESORT(mid+1,high)//将另一个子集合排序 * MEREG(low,mid,high); * } * end * * procedure MERGE(low,mid,high) * global A[1..n] * 设置辅助数组B(low..high) * h←low;i←low;j←mid+1 * while h≤mid and j≤high do * { if A[h]≤A[j] then * B[i] ←A[h];h←h+1 * else * B[i] ←A[j];j←j+1 * i←i+1 * } * if h>mid then //前部分已空 * for k←j to high do //处理后部分剩余的元素 * B[i] ←A[k] * i←i+1 * else * for k←h to mid do //处理前部分剩余的元素 * B[i] ←A[k] * i←i+1 * A ← B /* 将B数组的值赋给A数组 * * end */ public class GuiBingSort { public static void main(String[] args) { int []A ={3,9,4,7,10,34,23,11,2,1}; System.out.println("排序前的数组为:"); print(A); MERGESORT(A,0,A.length-1); System.out.println("排序后的数组为:"); print(A); } private static void print(int[] a) { // TODO 自动生成的方法存根 for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(""); } private static void MERGESORT(int[] A, int low, int high) { // TODO 自动生成的方法存根 int mid; if(low < high){ mid = (low+high)/2; MERGESORT(A,low, mid);//一个子集合排序 MERGESORT(A,mid+1, high);//另一个子集合排序 MERGE(A,low,mid,high);//归并两个以排序的子集合 } } private static void MERGE(int[] A, int low, int mid, int high) { // TODO 自动生成的方法存根 int h=low; int i=low; int j=mid+1; int []B = new int [A.length]; while((h<= mid)&&(j <= high)){ if(A[h] <= A[j]){ B[i] = A[h]; h = h+1; }else{ B[i]=A[j]; j = j+1; } i++; } if(h>mid){//前面部分已经空了 for(int k=j;k<=high;k++){ B[i]=A[k]; i++; } }else{//处理前部分剩余元素 for(int k=h;k<=mid;k++){ B[i]=A[k]; i++; } } for(int p = low;p<=high;p++){ A[p] = B[p]; } } }