package chap2;
import java.util.ArrayList;
import java.util.List;
public class MergeSort {
public static void merge(List<Integer> A,int p,int q,int r)//A[p,q] A[q+1,r]合并这两个数组
{
int n1=q-p+1;//左边数组size
int n2=r-q;//右边数组size
List<Integer> L=new ArrayList<Integer>();
List<Integer> R=new ArrayList<Integer>();
for(int i=0;i<n1;i++)
{
L.add(A.get(p+i));//初始化L数组
}
for(int j=0;j<n2;j++)
{
R.add(A.get(q+j+1));//初始化R数组
}
for (int k = p,i=0,j=0; k <= r; k++) {//将L,R合并到A
if (i==n1) {//L已全部比较完,将剩下的R全部拷贝到A中
A.set(k, R.get(j++));
continue;
}
if (j==n2) {//R已全部比较完,将剩下的L全部拷贝到A中
A.set(k, L.get(i++));
continue;
}
if (L.get(i)<=R.get(j)) {//将L,R中较小的放到A中
A.set(k, L.get(i++));
}else {
A.set(k, R.get(j++));
}
}
}
public static List<Integer> mergeSort(List<Integer> A,int p,int r)
{
if (p<r) {
int q=(p+r)/2;//采用2分
mergeSort(A, p, q);//递归划分
mergeSort(A, q+1, r);//递归划分
merge(A, p, q, r);//合并
}
return A;
}
public static void main(String[] args) {
List<Integer> A=new ArrayList<Integer>();
A.add(8);
A.add(9);
A.add(1);
A.add(2);
A.add(10);
A.add(3);
A.add(0);
A.add(300);
mergeSort(A, 0, A.size()-1);
for (Integer integer : A) {
System.out.print(integer+" ");
}
}
}
归并排序
最新推荐文章于 2024-08-12 19:32:44 发布