java实现归并排序

public class MergeSort {

    public void MergeSort(int a[],int left,int right){
         if(left>=right)                                        //递归出口
            return;
       int mid=(left+right)/2;
       MergeSort(a,left,mid);                                           //排序左边
       MergeSort(a,mid+1,right);                                   //排序右边
       Merge(a,left,mid,right);                                             //合并左右
    }
    public void  Merge(int a[],int left,int mid,int right)              //合并函数
    {
        int i=left,j=mid+1,k=0;			//i,j,k分别用于记录左边数组和右边数组还有暂存数组的下标
        int temp[]=new int[right-left+1];		//申请空间

        while(i<=mid&&j<=right){			//当左右边数组都没有遍历到末尾
            if(a[i]>a[j])						//左边比右边大的情况
                temp[k++]=a[j++];
            else
                temp[k++]=a[i++];
        }
        for(;k<temp.length;k++){		//遍历出来后,有一组遍历到末尾,那组的
           					 //数值都赋值到temp中了,现在对另一个未完成的赋值
            if(i==mid+1)	 		//右边未完成的情况
            {					
                temp[k]=a[j++];
            }
            else
                temp[k]=a[i++];
        }
        for(int q=left;q<=right;q++)   //把temp赋值给a这里注意q和边界,
        {
            a[q]=temp[q-left];
        }

    }


    public static void main(String[] args) {
        int a[] = new int[100];

        for (int i = 0; i < a.length; i++)              //产生0-10001的数组
            a[i] = (int) (Math.random() * 1000 + 1);
        new MergeSort().MergeSort(a, 0, a.length - 1);
        for (int i = 0; i < a.length; i++)
            System.out.println(a[i]);
    }

}

不理解的可以看这篇文章详细解释归并排序:
递归的过程稍微有点难理解,可以看文章中那张图就很容易理解啦
https://blog.csdn.net/weixin_41666747/article/details/102480482
空间复杂度是O(n) 时间复杂度O(nlogn) 稳定算法

上面合并也就是Merge函数过程有点冗余,是我自己想的,参考网上一段代码也可以写成这种形式

 public void  Merge(int a[],int left,int mid,int right)              //合并函数
    {
       // int i=left,j=mid+1,k=0;
        int temp[]=new int[right-left+1];
        for(int i=left;i<=right;i++)
            temp[i-left]=a[i];
        int i=left,j=mid+1,k=0;
        for(int p=left;p<=right;p++){
            if(i>mid&&j<=right)			//左边数组已经赋值完的情况
            {
                a[p]=temp[j-left];
                j++;
            }
            else if(j>right&&i<=mid)		//右边数组已经赋值完的情况
            {
                a[p]=temp[i-left];
                i++;
            }
            else if(temp[i-left]<=temp[j-left])	//左边小于右边数组的情况
            { a[p]=temp[i-left];i++;
            }
            else {							//右边小于左边
                a[p]=temp[j-left];j++;
            }
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值