java 实现二路归并排序
2016-06-12 20:23
405 查看
归并排序:是指将两个或两个以上有序的数列(或有序表),合并成一个仍然有序的数列(或有序表)
代码实现二路归并排序如下:
代码实现二路归并排序如下:
public class MergeSort { /*二路归并算法实现数组的排序*/ /*二路归并*/ public void MergeTwo(int array[],int low,int mid,int upper){ /*将有序序列array[low...mid]和有序序列array[mid+1...upper]合并成一个有序序列*/ /*将两个有序子序列合并,存放于一个临时数组中,合并完成后再复制回原序列数组中*/ int temp[]=new int[upper-low+1]; // 临时数组 int low1=low; int low2=mid+1; int pos=0; while(low1<=mid && low2<=upper){//将两个子序列归并 temp[pos++]=(array[low1]<=array[low2])?array[low1++]:array[low2++]; } /*将两个子序列尚未处理完的部分复制到temp中*/ while(low1<=mid){ temp[pos++]=array[low1++]; } while(low2<=upper){ temp[pos++]=array[low2++]; } /*归并完成,将temp中的元素复制回array中*/ for(pos=0,low1=low;low1<=upper;pos++,low1++){ array[low1]=temp[pos]; } } /*一趟归并排序*/ public void Merge(int array[],int len,int n){ /*将长度为len的序列两两归并,形成长度为n的序列*/ int i; for( i=0;i+2*len-1<n;i=i+2*len){ MergeTwo(array,i,i+len-1,i+2*len-1); } if(i+len-1<n){ //对余下的两个子序列归并 MergeTwo(array,i,i+len-1,n-1); } /*输出每趟排序的结果*/ for(i=0;i<n;i++){ System.out.print(array[i]); } System.out.println(); } /*二路归并排序*/ public void mergeSort(int array[],int n){ int i; for(i=1;i<n;i=i*2){ /*需要做log2(n)次排序*/ Merge(array,i, n); } } public static void main(String[] args) { /*使用归并排序法进行排序*/ int array[]=new int[]{9,8,7,6,5,4,3,2,1}; //把待排序的数存放在数组中 int n=array.length; MergeSort ms=new MergeSort(); ms.mergeSort(array,n); } }
相关文章推荐
- JAVA学习之OutputStream与FileOutputStram
- Eclipse错误: 找不到或无法加载主类或项目无法编译10种解决大法!
- Java集合细节:subList的缺陷
- ThreadPoolExecutor详解
- java 线程泄之一
- Eclipse查找类路径快捷方式
- eclipse安装swing插件
- Java组合和继承的区别
- Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
- SpringMVC学习--参数绑定
- Java8移除永久代
- Java(String类)
- 学习笔记之java中三种随机数的产生方法
- struts2中使用json格式ajax与后端action交互
- java读取txt文件
- 文件的上传下载与删除JavaEE(不通过数据库)
- struts2中的constant配置详解
- JAVA学习之InputStream类与FileInputStream
- 网页数据传输加密方法(前js+后java)
- Myeclipse导入java文件后乱码