归并排序
来源:互联网 发布:淘宝退款骗局过程 编辑:程序博客网 时间:2024/05/19 12:16
简单分析:
归并排序是典型的用分治思想解决问题的算法, 其基本思想是: 有两个有序数组,从两个数组首端开始比较。将较大或较小的元素加入一个空数组中,同时在原数组中删除。剩下的元素如此重复。最后就将两个有序数组合并成一个有序数组了。这样的过程成为归并。
与分治法结合在一起来考虑。如果不断递归拆分数组,直到拆分到最后只有两个元素了,也就是说把一个数组分成两边,一边只有一个元素,这是两边自然是有序的,满足有序归并的要求
实现思路:
- 1、先按归并排序原理实现数组的两部分合并。
- 2、通过递归调用拆分数组到单个元素级,再同时递归合并。
完整代码
package myFunction;public class MergeSort2 { //用于存放中间过程的数组 private int arrCopy[]; public void sort(int arr[]){ this.arrCopy = new int[arr.length]; //这里的left和right变量是数组的两个指针,指示数组两边,再计算出中间指针,便可以将数组一分为二。 int left = 0, right = arr.length-1; //调用拆分方法 cut(arr,left,right); arrCopy = null; } private void cut(int[] arr, int left, int right) { if(left < right){ int canter = left + (right - left) / 2, begin = left, end = right; cut(arr,begin,canter); cut(arr,canter+1,end); //前面可以看做是拆分数组,这里调用的方法可以看做合并数组 merge(arr,left,canter,right); } } //将元素归并 private void merge(int arr[],int left,int canter,int right) { int canterCopy = canter+1, leftCopy = left, i = left;//指示归并的起始下标位,就是对比后的元素从哪开始放 while(leftCopy <= canter && canterCopy <= right){ if(arr[leftCopy] <= arr[canterCopy]){ arrCopy[i++] = arr[leftCopy++]; }else{ arrCopy[i++] = arr[canterCopy++]; } } //如果数组的某一边有剩余元素,就把它们全部添加到中间数组。 while(leftCopy <= canter){ arrCopy[i++] = arr[leftCopy++]; } while(canterCopy <= right){ arrCopy[i++] = arr[canterCopy++]; } //将数组copy回原数组。不然下次归并的数组就不是有序的了 for(int j = left; j <= right;j++){ arr[j] = arrCopy[j]; } }}
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- Python学习笔记(29)-Python创建并写入word文档
- 伦敦永久性VR游乐场开业,将采用最新VR技术和采取付费的商业体验模式
- jquery——设置、读取、删除cookie
- 系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常
- HDU2389Rain on your Parade(二分图最大匹配之Hopcroft-Karp)
- 归并排序
- 状态压缩DP
- SpringMVC--全部
- const只读
- 素数对<筛选法求解>
- 尾递归:实际中为什么快排会比堆排快?
- 跳转动画——右进左出
- Android环境下手动写出观察者模式(非原生)
- iOS积累--iOS 出现内存泄漏的几种原因