八大排序----归并排序

归并排序是一种很稳定,很快的排序,时间复杂度为O(nlogn),作者很喜欢这个排序
大概思想就是分治,每次找一半,直到就剩一左一右两个元素,比如说{4,8,6,2,3,7}
递归找到最左面的也就是 {4,8}发现有序,然后回溯找右面的发现右面不够两个,再回溯也就是{4,8,6}合并,即{4,8}和{6}合并,取一个temp数组,用来存储合并后有序的这个数组,取左数组和右数组的头,遵循一个思想,谁小就把谁往temp里面放,然后下标++。

public static void merge(int[] nums,int l,int mid,int r,int[] temp){
    
    
        //初始下标
        int lindex=l,rindex=mid+1,tempi=l;
        while(lindex<=mid&&rindex<=r){
    
    
        	//谁小放谁,下标++
            if(nums[lindex]>nums[rindex]){
    
    
                temp[tempi++]=nums[rindex++];
            }else{
    
    
                temp[tempi++]=nums[lindex++];
            }
        }
        //可能一个数组都找完了另一个还剩挺多,所以将剩余的都放进temp,因为合并之前单个数组有序,所以可以直接放
        while(lindex<=mid) temp[tempi++]=nums[lindex++];
        while(rindex<=r) temp[tempi++]=nums[rindex++];
        //将合并好的有序的数组放回原数组
        for (int i = l; i <=r; i++) {
    
    
            nums[i]=temp[i];
        }
    }
    public static void sortmerge(int[] nums,int l,int r,int[] temp){
    
    
        if (l < r) {
    
    
        	//将数组切半
            int mid=(l+r)/2;
            //递归向左再向右,等两面都有序了再合并
            sortmerge(nums, l, mid,temp);
            sortmerge(nums, mid+1, r,temp);
            merge(nums,l,mid,r,temp);
        }
    }

猜你喜欢

转载自blog.csdn.net/weixin_43590593/article/details/113248601
今日推荐