您的位置:首页 > 编程语言 > Java开发

归并排序(Java描述)

2016-03-30 10:56 363 查看
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息