分治排序(MERGE-SORT)

来源:互联网 发布:最优化问题的典型案例 编辑:程序博客网 时间:2024/05/18 00:57
public class MergeSort {public static void main(String[] args) {// TODO Auto-generated method stubint[] A = {5, 2, 3, 6, 9, 1, 4, 5, 6};int p = 0;int r = A.length-1;mergeSort(A,p,r);}/** * Merge-Sort(A,p,r) * if p<r * then q = (p+r)/2 * Merge-Sort(A,p,q) * Merge-Sort(A,q+1,r) * Merge(A,p,q,r) *  * */private static void mergeSort(int[] A,int p, int r){if(p<r){int q = (p+r)/2;mergeSort(A,p,q);mergeSort(A,q+1,r);merge(A,p, q, r);}}/** * Merge(A,p,q,r) * n1 = q-p+1 * n2 = r-q * create arrays L[1..n1+1] and R[1..n2+1] * for i=1 to n1 * do L[i] = A[p+i-1] * for j=1 to n2 * do R[j] = A[q+j] * L[n1+1]<-无穷 * R[n2+1]<-无穷 * i=1 * j=1 * for k=p to r * do if L[i]<=R[j] * then A[k] = L[i] * i = i+1 * else A[k] = R[j] *j = j+1  *  *  * 输入:A是数组; p,q,r是A的下标;  p<=q<r * 例子: * A = [5, 2, 3, 6, 9, 1, 4, 5, 6, 7] * p = 1; * q = 4; * r = 9; * */private static void merge(int[] A,int p, int q, int r){for(int a : A){System.out.print(a+"\t");}System.out.println();int n1 = q-p+1;//left array sizeint n2 = r-q;//right array sizeint[] L = new int[n1+1];//初始化数组 Lint[] R = new int[n2+1];//初始化数组 Rfor(int i = 0; i<n1;i++){L[i] = A[p+i];}for(int j=0; j<n2;j++){R[j] = A[q+j+1];}L[n1] = 9999999;R[n2] = 9999999;for(int l : L){System.out.print(l+"\t");}System.out.println();for(int  rr : R){System.out.print(rr+"\t");}System.out.println();int i = 0;int j = 0;for(int k = p;k<=r;k++){if(L[i]<=R[j]){A[k] = L[i];i++;}else{A[k] = R[j];j++;}}for(int a : A){System.out.print(a+"\t");}}}

原创粉丝点击