归并排序(Java描述)
2016-03-30 10:56
363 查看
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
现象:可比较我的其他博客算法的现象
组建数组元素个数:10000000(千万)
组件随机数组运行时间:162
排序运行时间:1472
现象:可比较我的其他博客算法的现象
组建数组元素个数: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); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- JavaScript演示排序算法
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序