【java实现】算法导论之归并排序

/*
 * 算法导论2.3-2 java实现
 * 重写过程MERGE,使之不使用哨兵,而是一旦数组L或R的所有元素均被复制回A就立刻停止,然后把另一个数组的剩余部分复制回A。
 */
public class MERGE_SORT {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] A={3,41,52,26,38,57,9,49};
System.out.print("待排序数组为:");
for(int i=0;i<A.length;i++){
System.out.print(A[i]+"\t");
}
Merge_sort(A,0,A.length-1);
System.out.println();
System.out.print("排好序的数组为:");
for(int i=0;i<A.length;i++){
System.out.print(A[i]+"\t");
}
}

/**

* @param A 待排序数组
* @param p 待排序的第一个数的下标
* @param r 待排序的最后一个数的下标
*/
public static void Merge_sort(int[] A,int p,int r){
if(p<r){
int q=(p+r)/2;
Merge_sort(A,p,q);
Merge_sort(A,q+1,r);
Merge(A,p,q,r);
}
}

/**

* @param A 待排序数组
* @param p 待排序的第一个数的下标
* @param q 第一部分的末尾下标
* @param r 第二部分的末尾下标
*/
public static void Merge(int[] A,int p,int q,int r){
int n1=q-p+1;
int n2=r-q;
int[] L = new int[n1];
int[] R = new int[n2];
for(int i=0;i<n1;i++){
L[i]=A[p+i];
}
for(int i=0;i<n2;i++){
R[i]=A[q+i+1];
}
int k=p;
int i=0,j=0;
while(i<L.length && j<R.length){
if(L[i]<R[j]){
A[k]=L[i];
i++;
}
else{
A[k]=R[j];
j++;
}
k++;
}
while(i>=L.length&&j<R.length){
A[k]=R[j];
j++;
k++;
}
while(i<L.length&&j>=R.length){
A[k]=L[i];
i++;
k++;
}

}


}


待排序数组为:3 41 52 26 38 57 9 49
排好序的数组为:3 9 26 38 41 49 52 57

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值