归并排序
2015-09-03 10:31
232 查看
看了下思路,实现了下。发现在将数组的两段合并的时候出了点问题,改了有十来分钟。
之前在leetcode上做过一道题,将两个已经排序好的数组进行合并。归并排序的思路也是如此。归并排序采用的是递归的方法,在递归的最底层是一个个的单独的数字,两个数字按照顺序先合并,然后在进行过一次合并的这一层,再两两合并(此时要合并的两段已经是排序的了,因此用leetcode上的那道题的解题思路去实现就行)。由于合并过程都是在一个数组上进行的,因此对于下标要搞清楚。
代码:
之前在leetcode上做过一道题,将两个已经排序好的数组进行合并。归并排序的思路也是如此。归并排序采用的是递归的方法,在递归的最底层是一个个的单独的数字,两个数字按照顺序先合并,然后在进行过一次合并的这一层,再两两合并(此时要合并的两段已经是排序的了,因此用leetcode上的那道题的解题思路去实现就行)。由于合并过程都是在一个数组上进行的,因此对于下标要搞清楚。
代码:
package codes; public class MergeSort { public static void main(String[] args) { int [] arr = {3,4,6,10,1,2,9,7}; new MergeSort().mergeSort(arr); for(int i=0;i< arr.length;i++){ System.out.print(" "+arr[i]); } } public void mergeSort(int []nums){ merge(nums,0,nums.length-1); } public void merge(int [] nums,int low, int high){ if(low<high){ int mid = (low + high)/2; merge(nums,low,mid); merge(nums,mid+1,high); mergeArray(nums,low,mid,high); } } public void mergeArray(int[] nums, int low, int mid, int high ){ int [] tmp = new int[nums.length]; int p1=low,p2 = mid+1; int count =0; while(p1 <= mid && p2 <= high){ if(nums[p1]<=nums[p2]){ tmp[count++] = nums[p1++]; }else{ tmp[count++] = nums[p2++]; } } while(p1<=mid){ tmp[count++] = nums[p1++]; } while(p2<=high){ tmp[count++] = nums[p2++]; } for( int i=0;i<count;i++){ nums[low+i] = tmp[i];//copy 这里会写错。。 } } }
相关文章推荐
- 位运算相关总结
- oracle union 用法
- pacman -Syu : key could not be looked up remotely.
- VIM tab设置为4个空格
- hdu 5409 CRB and Graph 2015多校联合训练赛#10 dfs
- iOS开发十大必备开源框架
- Cocos2dx核心概念
- Service绑定日期
- 在Mac OS X上面指定Eclipse启动时用指定的某一版本JDK
- 01背包及其变种(物品无限背包、恰好装满背包)
- mmap系统调用
- 挑战JavaScript正则表达式每日两题(2)
- 开发中多条件搜索是使用StringBuilder创建sql语句
- CocoaPods安装使用
- SQL Server 2008 密钥 key 使用方法
- hdu 1202 The calculation of GPA
- [Cocoa]_[初级]_[使用NSMutableDictionary对多层循环里面的数据进行查找]
- 聚类算法与贪心算法
- 剑指Offer面试题:21.从上到下打印二叉树
- IOS deletate assign