您的位置:首页 > 编程语言 > Java开发

?未检查 Java排序算法大整理——归并排序

2018-03-21 17:30 253 查看
1.概念
    归并排序 (merge sort) 是一类与插入排序、交换排序、选择排序不同的另一种排序方法。归并的含义是将两个或两个以上的有序表合并成一个新的有序表。归并排序有多路归并排序、两路归并排序 , 可用于内排序,也可以用于外排序。这里仅对内排序的两路归并方法进行讨论。

    复杂度:时间复杂度O(nlogn),空间复杂度O(n),稳定     排序算法的稳定性:如果待排序的文件中,存在有多关键码相同的元素,经过排序后这些具有相同关键码的元素之间的相对次序保持不变,则称这种排序方法是稳定的;繁殖,若具有相同关键码的元素之间的相对次序发生变化,则称这种排序方法是不稳定的。《数据结构与STL》,下面图片来自https://www.bilibili.com/video/av8957042/?p=60


2.代码以下博客的代码很好https://www.cnblogs.com/chengxiao/p/6194356.html,有三个函数,一个是合并(核心),一个是最外面的,一个是中间的,注意临时数组需要在最外面的函数中声明,避免递归中重复申请新的空间。以下视频中有详细讲解。https://www.bilibili.com/video/av8957042/?p=68
    public static void main(String []args){
        int []arr = {9,8,7,6,5,4,3,2,1};
        Msort(arr);
        System.out.println(Arrays.toString(arr));
    }
    public  void Msort(int[] arr){
        int[] temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
        int left=0;
        int rightEnd=arr.length-1;
        MsortTemp(arr,temp,left,rightEnd);

    }
//核心函数是这两个,递归式
    public  void MsortTemp(int[] arr,int[] temp,int left,int rightEnd){
        if(left<right){
            int mid = (left+rightEnd)/2;
            MsortTemp(arr,temp,left,mid);//左边归并排序
            MsortTemp(arr,temp,mid+1,rightEnd);//右边归并排序
            merge(arr,temp,left,mid,rightEnd);//合并
        }
    }
    public void merge(int[] arr,int[] temp,int left,int leftEnd,int rightEnd){
        int len=rightEnd-left+1;
        int right = leftEnd+1;
        int t = left;
        while (left<=leftEnd && right<=rightEnd){
            if(arr[left]<=arr[right]){
                temp[t++] = arr[left++];
            }else {
                temp[t++] = arr[right++];
            }
        }
        while(left<=leftEnd){//将左边剩余元素填充进temp中
            temp[t++] = arr[left++];
        }
        while(right<=rightEnd){//将右序列剩余元素填充进temp中
            temp[t++] = arr[right++];
        }
        for(int i=0;i<len;i++){//将temp中的元素全部拷贝到原数组中
            arr[i]=temp[i];
        }
    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: