public class MergeSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] 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 size
int n2 = r-q;//right array size
int[] L = new int[n1+1];//初始化数组 L
int[] R = new int[n2+1];//初始化数组 R
for(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");
}
}
}
分治排序(MERGE-SORT)
最新推荐文章于 2024-04-07 20:33:32 发布