江的福从零开始冲算法(归并排序(分治))

归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(将问题成一些小的问题,然后递归求解,而的阶段则将分成的阶段得到的个答案“修补”在一起,即分而治之
在这里插入图片描述
在这里插入图片描述
先分后合,要学会联想jvm的工作原理,一条分支结束后一步一步出栈,进入下一分支,也就是递归回溯。


import java.util.Arrays;

public class MergeSort {
    public static void main(String[] args) {

        int[] arr ={8,4,5,7,1,3,6,2};
        int[] temp =new  int[arr.length];
        mergeSort(arr, 0, arr.length-1, temp);
        System.out.println(Arrays.toString(arr));


    }

    private static void mergeSort(int[] arr,int left,int right,int[] temp){
        if (left<right){
            int mid =(left+right)/2;
            //分
            mergeSort(arr, left, mid,temp);
            mergeSort(arr, mid+1, right, temp);
            //治
            merge(arr, left, mid, right, temp);
            System.out.println(left+" "+right);
        }
    }



        /**合并
         *
         * @param arr 原始数组
         * @param left 左边有序序列的初始索引
         * @param mid 中间索引
         * @param right 右边有序序列的初始索引
         * @param temp 中转数组
         */
    private static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i =left;
        int j =mid+1;
        int t =0; //temp 的当前索引
        while (i<=mid&&j<=right){
            if (arr[i]<=arr[j]){
                temp[t]=arr[i];
                i++;
                t++;
            }else {
                temp[t]=arr[j];
                j++;
                t++;
            }
        }
        //如果一方完了之后
            while (i<=mid){
                temp[t]=arr[i];
                t++;
                i++;
            }
            while (j<=right){
                temp[t]=arr[j];
                t++;
                j++;
            }

            //三、将temp数组的阿匀速拷贝到arr;
            //并不是每次都拷贝所有
        t=0;
        int templeft=left;
        while (templeft<=right){
            arr[templeft]= temp[t];
            templeft+=1;
            t+=1;
        }

    }
}

分治实战:
在这里插入图片描述
图解:
在这里插入图片描述

class Solution {

    public  String longestCommonPrefix(String[] strs) {
        String str="";
        if(strs.length==0||strs==null){
            return "";
        }else{
             str= mergefind(0,strs.length-1,strs);
        }
        return str;
    }
    public  String mergefind(int start,int last,String[] strs){
        if(start==last){
            return strs[start];
        }else{
            int mid =(start+last)/2;
            String leftstr= mergefind(start,mid,strs);
            String rightstr= mergefind(mid+1,last,strs);
            return merge(leftstr,rightstr);
        }
    }
    public  String merge(String leftstr,String  rightstr){
        if (leftstr.equals("")||rightstr.equals("")){
            return "";
        }
        int i =0;
        boolean flag =false;

        while(leftstr.charAt(i)==rightstr.charAt(i)){
            flag=true;
            i++;
            if (i>leftstr.length()-1||i>rightstr.length()-1) {
                break;
            }
        }
        if (flag){
            return leftstr.substring(0, i);
        }else {
            return "";
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值