归并排序
来源:互联网 发布:ug8.0车削加工编程 编辑:程序博客网 时间:2024/05/16 03:07
/*
* 1、将待排序的数组进行分割,分为两部分,对两部分进行排序,再向下递归。
* 2、将分成的两部分再次分割,直到只剩下一个元素。
* 3、此时结束递归向上返回,退出最后一层递归后,将将倒数第二层分割的两部分合并在一起,
* 之后,依次将各层递归分割开的部分合并,最终合并出有序数组
* 4、合并方法是归并排序的核心部分,
* 1)首先计算当前需要合并的的两个数组的总长度,定义一个temp数组保存合并起来的元素。
* 2)对分割开的两个数组(其实是一个数组,通过控制下标将数组分割)进行循环,同时从两个数组中取出
* 一个元素,比较大小,将小的一个保存到temp数组中,同时将temp的下标指针和取出当前元素的数组的下
* 标指针加一。
* 3)循环结束后进行判断,如果还有一个数组有剩余元素,则将此数组追加到temp数组后,生成的temp数组
* 就是有序的两个分割数组的合并。
* 4)将temp数组保存到原数组中。一次归并结束。
*/
package 归并;public class Demo { public static void main(String[] args) { // TODO 自动生成的方法存根 int[] arr = {1,4,3,5,7,2,9,8,10}; sort(arr,0,arr.length-1); for(int a:arr) { System.out.println(a); } } public static void sort(int[] arr,int l_index,int r_index) { int mid_index = (l_index+r_index)/2; if(l_index<r_index) { sort(arr,l_index,mid_index); sort(arr,mid_index+1,r_index); merge(arr,l_index,mid_index,r_index); } } public static void merge(int[] arr,int l_index,int mid_index,int r_index) { int[] temp = new int[r_index-l_index+1]; int i=l_index,j=mid_index+1,index=0; while(i<=mid_index&&j<=r_index) { if(arr[i]>arr[j]) { temp[index++] = arr[j++]; }else { temp[index++] = arr[i++]; } } if(i<=mid_index) { for(;i<=mid_index;i++) { temp[index] = arr[i]; index++; } } if(j<=r_index) { for(;j<=r_index;j++) { temp[index] = arr[j]; index++; } } index = 0; for(int k=l_index;k<=r_index;k++) { arr[k] = temp[index]; index++; } }}
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 31. Next Permutation
- SQL SERVER 获取数据库内存大小
- Minimum ASCII Delete Sum for Two Strings问题及解法
- Ubuntu Android/Sdk/build-tools/23.0.3/aapt": error=2, 没有那个文件或目录
- SQL Server 配置管理器无法打开
- 归并排序
- spring boot 源码
- JQ实现弹幕
- repo使用手册
- Word2013中如何合并多个文档将多篇内容放进一篇文档里
- TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)
- Fragment请求数据—+二维码
- 渲染管线-顶点变换
- C#通过app.manifest使程序以管理员身份运行