排序算法(七):归并排序
来源:互联网 发布:韩顺平php全套视频400 编辑:程序博客网 时间:2024/06/05 00:10
定义:
假设一个序列有n个记录,可以被看成是n个长度为1的子序列,将这些子序列两两归并,等到一个长度为2的子序列,再两两归并,直到子序列长度为n,就得到了一个有序的序列。
时间复杂度:O(nlogn)
实现:
1、递归实现
public class merge { public void sort(int[] arr){ int[] newarr= new int[arr.length]; msort(arr,newarr,0,arr.length-1); } /** *递归实现 * @param arr * @param begin * @param end * @return */ private void msort(int[] arr,int[] newarr,int begin,int end){ int[] tarr=new int[arr.length]; if(begin == end){ newarr[begin]=arr[begin]; }else{ int mid=(begin+end)/2; msort(arr,tarr,begin,mid); msort(arr,tarr,mid+1,end); mergearr(tarr,newarr,begin,mid,end); } SortUtils.print(newarr); } private void mergearr(int[] arr,int[] newarr,int begin,int mid,int end){ int i,j,k; for(i=begin,j=mid+1,k=i;i<=mid && j<=end;k++){ if(arr[i]<arr[j]){ newarr[k]=arr[i]; i++; }else{ newarr[k]=arr[j]; j++; } } if(i<=mid){ for(int m=0;m<=mid-i;m++){ newarr[k+m]=arr[i+m]; } } if(j<=end){ for(int m=0;m<=end-j;m++){ newarr[k+m]=arr[j+m]; } } } public static void main(String[] args){ int[] arr= SortUtils.getArray(); merge merge=new merge(); merge.sort(arr); }}
2、非递归实现
public class merge { public void sort(int[] arr){ int k=1; int[] newarr=new int[arr.length]; while(k<arr.length){ psort(arr,newarr,k,arr.length); //SortUtils.print(newarr); k=k*2; psort(newarr,arr,k,arr.length); k=k*2; //SortUtils.print(arr); } } /** *非递归实现 * @param arr * @param newarr * @param k * @param len */ private void psort(int[] arr,int[] newarr,int k,int len){ System.out.println("k:"+k); int i=0; while(i +2*k-1<len){ mergearr(arr,newarr,i,i+k-1,i+2*k-1); i=i+2*k; SortUtils.print(newarr); } if(i+k < len){ mergearr(arr,newarr,i,i+k-1,len-1); System.out.print("merge:"); SortUtils.print(newarr); }else{ for(int j=i;j<len;j++){ newarr[j]=arr[j]; } System.out.print("move:"); SortUtils.print(newarr); } } private void mergearr(int[] arr,int[] newarr,int begin,int mid,int end){ int i,j,k; for(i=begin,j=mid+1,k=i;i<=mid && j<=end;k++){ if(arr[i]<arr[j]){ newarr[k]=arr[i]; i++; }else{ newarr[k]=arr[j]; j++; } } if(i<=mid){ for(int m=0;m<=mid-i;m++){ newarr[k+m]=arr[i+m]; } } if(j<=end){ for(int m=0;m<=end-j;m++){ newarr[k+m]=arr[j+m]; } } } public static void main(String[] args){ int[] arr= SortUtils.getArray(); merge merge=new merge(); merge.sort(arr); }}
0 0
- 排序算法(七):归并排序
- 八大排序算法(七)归并排序
- 排序算法(七):归并排序
- 排序算法(七):归并排序
- 排序算法七:归并排序
- 算法——排序(七)归并排序
- 排序算法(七) 2路归并排序
- 排序算法之七--归并排序
- 排序七 归并排序
- 数据结构与算法之七归并排序
- 数据结构与算法:七种排序算法总结(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序)
- 排序算法-归并排序
- 排序算法------归并排序
- 排序算法-归并排序
- 排序算法---归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- wince 中使用HttpSendRequest函数POST数据时应该注意的一点
- Python中生成唯一码(uuid的使用)
- jquery集合遍历
- edx 学习备忘
- ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立
- 排序算法(七):归并排序
- IOS通过加速感应器实现手机实现手机屏幕上的足球可以来回的滚动反弹
- 将阿拉伯数字钱格式转换成中文格式
- linux核心版本号的说明
- DML、DDL、DCL区别
- android之surfaceview画图
- 深入浅出Java并发包—锁(Lock)VS同步(synchronized)
- paip.log4j 日志系统 参数以及最佳实践
- 从 Java 代码调用 C/C++ 的六个步骤