归并排序 Java实现(递归试)
2018-03-18 13:11
274 查看
归并排序: 将两个有序的序列合并成一个有序的序列,相当于手中有两副已经排好序并且每副单独叠到一起的牌,一次判断大小,再重新放到一个新的位置并排好序
对于一副混乱的牌而言,可以将牌分成两两一组,再依次合并排序,归并排序算法复杂度 纵向递归深度log(n) 横向比较次数为c*n,复杂度为O(n*log(n))
对于一副混乱的牌而言,可以将牌分成两两一组,再依次合并排序,归并排序算法复杂度 纵向递归深度log(n) 横向比较次数为c*n,复杂度为O(n*log(n))
public class MergeQuene { static public int[] mergeQuene(int[] number,int leftEdge,int rightEdge){ int middle = (leftEdge+rightEdge)/2; if(rightEdge>leftEdge){ //递归调用 mergeQuene(number,leftEdge,middle); mergeQuene(number,middle+1,rightEdge); mergeAlgo(number, leftEdge, rightEdge); } return number; } static private int[] mergeAlgo(int[] arr,int leftEdge,int rightEdge){ //加取余的原因: 在排序数非偶数个时,由于左边两个已经排序完成,需要在分组时放到相同的序列中 int leftNum=(rightEdge-leftEdge+1)/2+(rightEdge-leftEdge+1)%2; int rightNum=rightEdge-leftEdge+1-leftNum; //左右两个数组赋值 int[] leftArr = new int[leftNum]; int[] rightArr = new int[rightNum]; for(int i=0;i<leftNum;i++){ leftArr[i]=arr[i+leftEdge-1]; } for(int j=0;j<rightNum;j++){ rightArr[j]=arr[j+rightEdge-rightNum]; } //对左右两个数组进行归并排序,对于其中一组数据用完,则第二组直接赋值 int m=0,n=0; for(int i=0;i<leftNum+rightNum;i++){ if(leftArr[m]<rightArr ){ arr[i+leftEdge-1]=leftArr[m]; m++; if(m>=leftNum){ for(;i<leftNum+rightNum-1;i++){ arr[i+leftEdge]=rightArr ; n++; } return arr; } }else{ arr[i+leftEdge-1]=rightArr ; n++; if(n>=rightNum){ for(;i<leftNum+rightNum-1;i++){ arr[i+leftEdge]=leftArr[m]; m++; } return arr; } } } printArr(arr); return arr; } public static void printArr(int[] arr){ for(int i=0;i<arr.length;i++){ System.out.println("quene arr "+arr[i]); } } }
相关文章推荐
- 递归思想详解以及归并排序(java实现)
- 归并排序 C++/Java 递归实现代码 -犯了菜鸟老毛病
- 归并排序的递归与非递归实现理解(Java)
- 改进归并排序消除递归Java实现
- 归并排序的递归与非递归实现java
- Shell、归并排序、递归的java实现
- 递归和迭代两种方式实现归并排序(Java版)
- 归并排序非递归实现Java
- 归并排序(Merge Sort)递归、非递归 Java实现
- 两种归并排序算法的实现:二路归并排序和基本归并排序(虚拟消除递归的二路归并排序)
- java实现的归并排序
- 用java实现的迭代和递归插入排序
- Java实现折半查找(二分查找)的递归和非递归算法
- java实现的递归方法逆序对查找
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 归并排序递归实现C语言
- 归并排序非递归实现C语言
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- java 递归实现二叉树
- java递归实现文件的删除和拷贝