归并排序

一. 先上代码

public class guibing {
    public static void main(String[] args) {
     
        int a[]={1,83,5,17,2,4,26,9,6,1,16,6};
        int[] temp = new int[a.length];
         guibing.sort(a,0,a.length-1,temp);

        for (int i = 0; i < temp.length; i++) {
            int i1 = temp[i];
            System.out.println(i1);

        }

    }

  public static void sort(int arr[],int left, int right, int[] temp){

        if(left < right) {
            int mid =(left+right)/2;
            sort(arr, left, mid, temp); //左边的排序
            sort(arr,mid+1, right, temp); //右边的排序
            merge(arr, left, mid, right, temp); //将排好的进行合并
        }

  }
    /**
     *
     * @param arr
     * @param left
     * @param mid
     * @param right
     * @param temp
     * @return
     */

    public static  void merge(int arr[], int left, int mid, int right, int[] temp){
        int i=left;
        int j=mid+1;
        int al=mid+1;
        int bl=right+1;

        for (int k=0; k< right+1; k++){
            if(i>mid && j>right)
                break;
            // 判断这两个数组是否有已经遍历完的
            if(i >=al && j<bl){
               temp[k] = arr[j];
               j++;
               continue;
            }
            if(j >=bl && i<al){
                temp[k] = arr[i];
                i++;
                continue;
            }
            //进行比较
            if(arr[i]>arr[j]){
                temp[k]=arr[j];
                j++;
                continue;
            }else {
                temp[k]=arr[i];
                i++;
                continue;
            }

        }
        // 将 temp的拷贝arr中
        int  t=0;
        while(left<= right){
            arr[left++] =temp[t++];
        }

    }
}

2.归并排序,主要思路就是

我先拆,拆成最基本的,然后回头再排序,让左边和右边有序的数组继续排序。

直接 用https://www.cnblogs.com/chengxiao/p/6194356.html的图片

正如代码中

2.1merge()方法进行的比较,将数组排序;

2.2sort()的功能是拆 与 和,主要是用于安排多次merge 方法调用的正确顺序;

这个时候就需要用递归实现,因为最基本的就是先拆成一个,然后左一和右一排序,拍完后左二和右二继续排,以此类推调用merge(); 递归的判断点就在于  (right>left) 。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值