归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
现象:可比较我的其他博客算法的现象
组建数组元素个数:10000000(千万)
组件随机数组运行时间:162
排序运行时间:1472
import java.util.Random;
public class MergeSort {
public static void show(int [] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+"、");
}
System.out.println();
}
public static int[] get_intarr(int len){
long begin = System.currentTimeMillis();
Random ran = new Random();
int [] result = new int[len];
for(int i=0;i<len;i++){result[i] = ran.nextInt(10000); }
long runtime = System.currentTimeMillis()-begin;
System.out.println("组建数组元素个数:"+len);
System.out.println("组件随机数组运行时间:"+runtime);
return result;
}
//合并2个有序序列
public static void MemeryArray(int []a,int []b,int []c){
int i=0,j=0,k=0;
//先将2个序列的数据排进c序列
while(i<a.length && j<b.length){
if(a[i]<b[j]){
c[k++] = a[i++];
}else{
c[k++] = b[j++];
}
}
while(i<a.length){
c[k++] = a[i++];
}
while(j<b.length){
c[k++] = b[j++];
}
}
//将2个有序数列a[first.......mid],b[mid+1.....last]合并
public static void mergearray(int []a,int first,int last,int []tmp){
int mid = (first+last)/2;
int i=first,j=mid+1;
int m=mid,n=last;
int k=0;
//有序合并2个序列直至其中一个被遍历完
while(i<=m && j<=n){
if(a[i]<a[j]){
tmp[k++] = a[i++];
}else{
tmp[k++] = a[j++];
}
}
while(i<=m){
tmp[k++] = a[i++];
}
while(j<=n){
tmp[k++] = a[j++];
}
//将tmp转移至a中
for(int l=0;l<k;l++){
a[first+l] = tmp[l];
}
}
//归并排序核心代码,将a[]循环拆分成有序的数组,然后将这些有序数组合并
public static void mergesort(int a[],int first,int last,int []tmp){
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, tmp); //左边有序
mergesort(a, mid + 1, last, tmp); //右边有序
mergearray(a, first, last, tmp); //再将二个有序数列合并
}
}
public static void main(String[] args) {
int a[] = get_intarr(10000000);
int c[] = new int[a.length];
// mergearray(a,0,2,c);
long begin = System.currentTimeMillis();
mergesort(a,0,a.length-1,c);
long runtime = System.currentTimeMillis()-begin;
System.out.println("排序运行时间:"+runtime);
// show(a);
}
}