合并排序算法是用分治策略实现对N个元素进行排序的算法。其基本思想是:
将待排序元素分成大小大致相同 的两个子集合,分别 对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。
重点:
1.分治的实现
2.合并的实现
分治,就是把整个集合的元素一直除2化分,一直化为到没有两个元素开始合并。
图:
分治的时候比较简单,一直除2递归就行了,合并的时候为了方便就借助另一个变化的数组来接收交换的数组,
合并的时候,两个指标i、j,把值比较小的放入temp数组中,然后放入那个值的那一边的指标自加,继续比较。一直把值合部排完合并为一个数组,然后把temp数组复制回到原来数组就可以进入下一个递归。
完全代码由下:
public class Merge { //递归分成小部分 public void merge_sort(int[] arrays,int start,int end){ if(start<end){ int m=(start+end)/2; merge_sort(arrays,start,m); merge_sort(arrays,m+1,end); combin_arrays(arrays,start,m,end); } } //合并数组 public void combin_arrays(int[] arrays,int start,int m,int end){ int length=end-start+1; int temp[]=new int[length];//用来存放比较的数组,用完复制回到原来的数组 int i=start; int j=m+1; int c=0; while(i<=m &&j<=end){ if(arrays[i]<arrays[j]){ temp[c]=arrays[i]; i++; c++; }else{ temp[c]=arrays[j]; j++; c++; } } while(i<=m){ temp[c]=arrays[i]; i++; } while(j<=end){ temp[c]=arrays[j]; j++; } c=0; for(int t=start;t<=end;t++,c++){ arrays[t]=temp[c]; } snp(arrays); } //打印数组 public void snp(int[] arrays){ for(int i=0;i<arrays.length;i++){ System.out.print(arrays[i]+" "); } System.out.println(); } public static void main(String[] args) { Merge m=new Merge(); int a[]={5,4,10,8,7,9}; m.merge_sort(a,0,a.length-1); } }
由有不对之处请大家指出,谢谢