您的位置:首页 > 编程语言 > Java开发

二路归并2算法的java实现(普通方法)

2014-12-03 20:36 543 查看
这里是二路归并排序算法的普通实现:

package GB;
/**
*
* @author YuYunTan(谭淇蔚)
*这里是算法,归并排序,这是二路归并排序算法
*分治策略的思想:
*任一实例
*I = (n,A[1],...,A
)分成两个这样的实例
*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];
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: