合并排序采用分治的模式,分治模式在每一层递归上都有3个步骤:
1、分解(Divide):将原问题分解成一系列的子问题。
2、解决(Conquer):递归第解决子问题。
3、合并(Combine):将子问题的结果合并成原问题的解。
合并排序完全按照上面的模式,直观的操作如下:
分解:将n个元素分成n/2个元素的子问题。
解决:用合并排序对两个子序列递归的排序。
合并:合并两个已经排序的子序列得到排序的结果。
用java实现的合并排序代码如下:
import java.util.Arrays; public class MergeSortTest { public static void main(String[] args) { int a[] = {100,2,9,6,3,4,7,45,11,1,8}; merge_sort(a,0,a.length-1); System.out.println(Arrays.toString(a)); } public static void merge_sort(int a[],int p, int r){ if(p<r){ //分解 int q = (p+r)/2; merge_sort(a,p,q); merge_sort(a,q+1,r); //合并 merge(a,p,q,r); } } //合并两个已经排好序的数组到目标数组a中 public static void merge(int []a,int p,int q,int r) { int n1 = q-p+1; int n2 = r-q; int L[] = new int[n1]; int R[] = new int[n2]; int i,j,k; for(i=0; i<n1; i++) { L[i] = a[p+i]; } for (j=0; j<n2; j++) { R[j] = a[q+j+1]; } i = 0; j = 0; for (k=p; k<=r;k++) { if (L[i]>=R[j]) { a[k] = L[i]; i++; //如果L数组中的所有元素全部被复制到a中了,就把R数组中剩下的元素全部复制到a数组中 if(i==n1){ k++; for (; j< R.length; j++) { a[k++] = R[j]; } break; } }else{ a[k] = R[j]; j++; //如果R数组中的所有元素全部被复制到a中了,就把L数组中剩下的元素全部复制到a数组中 if(j==n2){ k++; for (; i< L.length; i++) { a[k++] = L[i]; } break; } } } } }结果:
[100, 45, 11, 9, 8, 7, 6, 4, 3, 2, 1]