归并排序--Java实现
2016-03-11 01:31
513 查看
package com.shusheng.mergeSort; /** * 归并排序(作图分析) * @author Administrator * */ public class MergeSort { /** * 该方法会对array的first-between区间,between-last区间进行合并排序 * (默认是这两个区间都已经分别排好序) * @param array 表示原始数组 * @param first 表示第一个要排序区间的第一个下标 * @param between,表示第一个要排序区间的最后一个下标,也作为第二个排序区间的第一个下标 * @param last 第二个待排序区间的最后一个下标 */ private static void mergeSort(int[] array,int first,int between,int last) { int n1 = between-first+1;//因为first有可能等于零,下标可以从零开始,比如2-0=2,但其实数组大小应该为3,所以应该加1 int n2 = last-between;//n1构造的数组已经包含了between下标的元素,所以n2就不用包含between下标的元素了 int[] lArray = new int[n1];//该数组装载array的first到between下标的值 int[] rArray = new int[n2];//该数组状态array的between到last的值 int i,j,temp; //将first-between区间的元素拷贝到lArray数组, for (i=0,temp=first;temp<=between;) { lArray[i++] = array[temp++]; } //将between+1到last的元素拷贝到rArray数组 for (j = 0,temp = between+1;temp<=last;) { rArray[j++] = array[temp++]; } //当i和j都没有移动到尽头时,对两个数组的第i个元素和第j个元素比较 for(i=0,j=0;i<lArray.length&&j<rArray.length;){//i和j表示lArray移动的下标和rArray数组移动的下标 if(lArray[i]<=rArray[j]){//如果lArray的第i个元素小于rArray的第j个元素,就将lArray的第i个元素拷贝到array中,first移动 array[first++] = lArray[i++]; }else {//同理 array[first++] = rArray[j++]; } } while(i<lArray.length){//当上面的循环有一个已经移动到尽头(j已经移动到尽头),就将lArray的剩下的值赋值给array,因为lArray已经是有序的 array[first++] = lArray[i++]; } while(j<rArray.length){//当上面的循环有一个已经移动到尽头(i已经移动到尽头),就将rArray的剩下的值赋值给array,因为rArray已经是有序的 array[first++] = rArray[j++]; } } /** * 归并排序的公开函数, * @param array 原始数组 * @param first 表示待排区间的第一个下标 * @param last表示待排区间的最后一个下标 */ public static void mergeSortMethod(int[] array,int first,int last){ if(first>=last) return;//表示array的first和last指向同一个元素,只有一个元素就不用排序了,否则就继续分割 int between = (first+last)/2; mergeSortMethod(array,first,between);//把要排序区间分割前一半进行递归排序 mergeSortMethod(array,between+1,last);//把要排序区间的后一半进行递归排序 //当执行到下面这个函数时,说明first-between区间,between-last区间都已经有序了,再合并这两个有序区间成为一个新的从first-last的有序区间 mergeSort(array,first,between,last); } /** * 测试方法 * @param args */ public static void main(String[] args) { int[] args1 = {12,53,48,26,42,62,46,45}; mergeSortMethod(args1,0,args1.length-1); for (int i = 0; i < args1.length; i++) { System.out.println(args1[i]); } } }
有问题欢迎留言
相关文章推荐
- spring的RestTemplate的配置及使用
- java将字符串进行反转单词需正确拼写
- 简单插入排序--Java实现
- 堆排序--Java实现
- struts2的执行流程
- JavaWeb学习(四):JavaBean
- Java static关键字使用小结
- JAVA工程师成神之路
- ubuntu下安装、配置JDK8
- 【图】解类似MyEclipse查看原始类出现”The JAR file dom4j-1.6.1jar has no source attachment”的问题
- 冒泡排序--Java实现
- Java入门 之深入浅出吧
- java中静态代码块的用法 static用法详解和static静态导入
- [Java开发之路](20)try-with-resource 异常声明
- spring aop 基于xml配置版
- 1.java开篇
- Struts 1或2 ActionForm接受不到页面传值的问题
- 单点登录研究一
- JavaWeb学习(二):Servlet
- JavaWeb学习(三):jsp