挑战七大排序算法-07归并排序

我们两清 提交于 2020-02-21 07:06:56

归并排序

1.原理

排序一个数组,先把数组从中间分成前后两个部分,然后对前后两部分分别排序,再将排序好的两部分合并在一起

2.实现

public void mergeSort(int[] array){
        mergeSortInternal(array,0,array.length-1);
    }
​
    private void mergeSortInternal(int[] array,int left,int right){
        if (left >= right){
            return;
        }
        int mid = (left+right)/2;
        mergeSortInternal(array,left,mid);
        mergeSortInternal(array,mid+1,right);
        //合并
        merge(array,left,mid,right);
    }
​
    private void merge(int[] array,int l,int m,int r){
        int i = l;
        int j = m+1;
        int k = 0;
        int[] extra = new int[r-l+1];
        while (i <= m && j <= r){
            if(array[i] <= array[j]){
                extra[k++] = array[i++];
            }else{
                extra[k++] = array[j++];
            }
        }
        //判断哪个数组还有元素
        int start = i;
        int end = m;
        //第二个数组还有元素
        if (j <= r){
            start = j;
            end = r;
        }
        //将剩余元素拷贝至临时数组中
        while (start <= end){
            extra[k++] = array[start++];
        }
​
        //将数组元素拷贝回原来的数组
        for(i = 0;i <= r-l;i++){
            array[l+i] = extra[i];
        }
    }

3.性能分析

1.时间复杂度

O(n*logn)

2.空间复杂度

O(n)

3.稳定性?

稳定性排序

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!