赞
踩
1.把数组从中间划分成两个子数组
;
2.一直递归
地把子数组划分成更小的子数组
,直到子数组里面只有一个元素
3.依次按照递归的返回顺序,不断地合并排好序的子数组
,直到最后把整个数组的顺序排好。
O(nlogn),稳定性看比较大小时是否加=
package DataStructureAndAlgorithm.Sort.HartSort; /** * 归并排序 */ public class Merge { private static Comparable[] assist; //对外的整体排序 public static void sort(Comparable[] c){ assist=new Comparable[c.length];//辅助数组 sort(c,0,c.length-1); } //内部分段排序,从索引low到索引high的排序,采用递归分治 private static void sort(Comparable[] c,int low,int high){ //划分到直至不可再分 if(low>=high) return; int mid=low+(high-low)/2;//中间位置 sort(c,low,mid); sort(c,mid+1,high); merge(c,low,mid,high); } //将分段排序好的数组整合成一个数组 private static void merge(Comparable[] c,int low,int mid,int high){ //辅助数组指针 int i=low; //两个子组的指针 int lo = low; int hi= mid+1; while (lo<=mid&&hi<=high){ //选取两个子组元素的较小值存入辅助数组 if(greater(c[lo],c[hi])){ assist[i++]=c[hi++]; }else{ assist[i++]=c[lo++]; } } //lo子组没有遍历完 while (lo<=mid){ assist[i++]=c[lo++]; } //hi子组没有遍历完 while (hi<=high){ assist[i++]=c[hi++]; } //将辅助数组已经排好序的子组复制到原数组 for (int j = low; j <=high ; j++) { c[j] = assist[j]; } } //判断前者是否大于后者 private static boolean greater(Comparable c1 ,Comparable c2){ return c1.compareTo(c2)>0; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。