归并排序算法
package com.cn.gao; //归并排序算法设计 public class MergeSort { public static final int SIZE=15; /** * 合并一次算法 * @param a 原数组 * @param b 合并后存放数据数组 * @param n 数组a中元素个数 * @param len 有序元素的长度 */ public static void mergeOne(int[] a,int[] b,int n,int len){ int i,j,k,l,m; i=0; while(i+len<n){ j=i+2*len-1; if(j>=n){ //最后一段可能少于len个元素 j=n-1; } m=i; k=i; l=i+len; //合并相邻有序段 while(i<k+len&&l<=j){ if(a[i]<=a[l]){ b[m++]=a[i++]; }else{ b[m++]=a[l++]; } } //将未合并的部分复制到数组b中 while(i<k+len){ b[m++]=a[i++]; } while(l<=j){ b[m++]=a[l++]; } i=j+1; //下一对有序段左段的开始下标 } //将剩余的有序段加入b中 if(i<n){ for(;i<n;i++){ b[i]=a[i]; } } } /** * 最终合并算法 * @param a 原始数组 * @param n 数组元素个数 */ public static void mergeSort(int a[], int n){ int [] b = new int[n]; int len=1,flag=0,count=0; while(len<n){ if(flag==0){ mergeOne(a,b,n,len); //合并到b中 } if(flag==1){ mergeOne(b,a,n,len); //合并到a中 } flag=1-flag; len=2*len; count++; //输出每趟归并后的结果 System.out.print("第"+count+"次排序的结果为:"); for(int i=0;i<n;i++){ System.out.print(" "+(flag==0?a[i]:b[i])); } System.out.println(); } if(flag==1){ //如果最后一步合并到b中 for(int i=0;i<n;i++){ a[i]=b[i]; } } } public static void main(String[] args) { int[] a = new int[SIZE]; //为数组赋值 for(int i=0;i<a.length;i++){ a[i] = (int) (100 + Math.random()*100); } //输出排序前的数组 System.out.println("排序前的数组为:"); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); //对数组排序 mergeSort(a,SIZE); //输出排序后的数组 System.out.println("排序后的数组为:"); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); } System.out.println(); } }