归并排序---JAVA实现

归并排序思路:

把数组中的每一个元素看做是一个有序表,把相邻的两个表进行归并,组成一个新的有序表并不断以此类推直到最后变成一个有序表。

时间复杂度:

O(NlogN)

空间复杂度:

O(N) 因为需要一个临时数组来存储当前归并后的表并最后赋值回来

实现思路:

  1. 递归实现把当前的数组分割成若一个个单个的元素通过递归的方式想,相当于二分法,分割完之后再对分割完的两个进行归并操作。
  2. 递归的最深层是分割成了两个独立的元素,在合并后依次往外进行弹出,最后形成一张有序的表
  3. 归并函数,就是不断吧两个表中较小的元素存储到临时的数组中之后再赋值回来的过程。要十分注意最后赋值的方法,是吧当前i到j的元素赋值回来要不然原来的数组元素逻辑就乱了。

代码:

package 归并排序;
//归并排序
public class MergeSort {

    public static void sort(int[] array,int i,int j){
        //对其进行排序处理
        if(i<j){
            //对其进行分解处理底层拆分成单个元素的有序表进行两两归并
            int middle = (i+j)/2;
            sort(array,i,middle);
            sort(array,middle+1,j);
            merge(array,i,middle,j);
        }
    }

    public static void merge(int[] array,int i,int middle,int j){
        //左有序表的起始索引
        int left = i;
        //右有序表的起始索引
        int right = middle+1;
        //临时存储数组的索引
        int index = i;
        //临时存储数组
        int[] temp = new int[array.length];
        //把两个有序表按照升序排列,如果长度不同则长度有序表元素有剩余
        while(left<=middle && right<=j){

            if(array[left]<=array[right]){
                temp[index++] = array[left++];
            }else{
                temp[index++] = array[right++];
            }
        }
         while(left<=middle&&right<=j)
            {
                if(array[left]<array[right])
                    temp[index++]=array[left++];
                else
                    temp[index++]=array[right++];
            }
        //当左有序表元素有剩余的时候给与赋值
        while(left<=middle){
            temp[index++] = array[left++];
        }
        //当右有序表元素有剩余的时候给与赋值
        while(right<=j){
            temp[index++] = array[right++];
        }
        //把临时的数组元素赋予给真正变化的数组
        while(i<=j)
        {
            array[i]=temp[i++];
        }
    }

    public static void main(String[] args){
        int[] array = {13,42,52,25,63,1,2,35,7,9};

        System.out.println("归并排序前:");
        for(int i=0;i<array.length;i++){
            System.out.print(array[i]+" ");
        }
        System.out.println();
        System.out.println("归并排序后:");
        sort(array, 0, array.length-1);     

        for(int i=0;i<array.length;i++){
            System.out.print(array[i]+" ");
        }
    }
}

结果:

归并排序前:
13 42 52 25 63 1 2 35 7 9
归并排序后:
1 2 7 9 13 25 35 42 52 63

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值