这里是二路归并排序算法的普通实现:
package GB;
/**
*
* @author YuYunTan(谭淇蔚)
*这里是算法,归并排序,这是二路归并排序算法
*分治策略的思想:
*任一实例
*I = (n,A[1],...,A[n])分成两个这样的实例
*I1 = ([n/2],A[1],...,A([n/2]))和
*I2 = ([n/2],A[[n/2]+1],...,A(n))
*分别对每个集合单独排序,然后将已排序的两个序列归并成一个含n个元素的分好类的序列
*
*这种思想是典型的分治设计思想,归并排序也叫做分治合并排序
*
*算法如下:
*procedure MERGESORT(low,high)
*global A[1...n]
*if(low < high)
* then mid = (low+high)/2;//求这个集合的分隔点
* {
* MERGESORT(low,mid);//将这个子集合排序
* MERGESORT(mid+1,high)//将另一个子集合排序
* MEREG(low,mid,high);
* }
* end
*
* procedure MERGE(low,mid,high)
* global A[1..n]
* 设置辅助数组B(low..high)
* h←low;i←low;j←mid+1
* while h≤mid and j≤high do
* { if A[h]≤A[j] then
* B[i] ←A[h];h←h+1
* else
* B[i] ←A[j];j←j+1
* i←i+1
* }
* if h>mid then //前部分已空
* for k←j to high do //处理后部分剩余的元素
* B[i] ←A[k]
* i←i+1
* else
* for k←h to mid do //处理前部分剩余的元素
* B[i] ←A[k]
* i←i+1
* A ← B /* 将B数组的值赋给A数组
*
* end
*/
public class GuiBingSort {
public static void main(String[] args) {
int []A ={3,9,4,7,10,34,23,11,2,1};
System.out.println("排序前的数组为:");
print(A);
MERGESORT(A,0,A.length-1);
System.out.println("排序后的数组为:");
print(A);
}
private static void print(int[] a) {
// TODO 自动生成的方法存根
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println("");
}
private static void MERGESORT(int[] A, int low, int high) {
// TODO 自动生成的方法存根
int mid;
if(low < high){
mid = (low+high)/2;
MERGESORT(A,low, mid);//一个子集合排序
MERGESORT(A,mid+1, high);//另一个子集合排序
MERGE(A,low,mid,high);//归并两个以排序的子集合
}
}
private static void MERGE(int[] A, int low, int mid, int high) {
// TODO 自动生成的方法存根
int h=low;
int i=low;
int j=mid+1;
int []B = new int [A.length];
while((h<= mid)&&(j <= high)){
if(A[h] <= A[j]){
B[i] = A[h];
h = h+1;
}else{
B[i]=A[j];
j = j+1;
}
i++;
}
if(h>mid){//前面部分已经空了
for(int k=j;k<=high;k++){
B[i]=A[k];
i++;
}
}else{//处理前部分剩余元素
for(int k=h;k<=mid;k++){
B[i]=A[k];
i++;
}
}
for(int p = low;p<=high;p++){
A[p] = B[p];
}
}
}