归并排序

归并排序

2020-06-21
数据结构

思想 #

1.将序列元素先分割成一个个单独的元素,由于只有一个元素,我们可以看作它是有序的

2.将上述的序列两两合并,并使得他们合并后的结果仍然有序

3.重复上述步骤,直到合成一个完整的序列

从实现上来看,有点像二叉树的后序遍历。

代码实现 #

    public void mergeSort(int[] a,int low,int high){
        //可以看到,当切割到只剩一个元素时,开始进行合并
        if(low<high){
            //找到数组中的中间点,把数组分为两部分
            int mid=(low+high)/2;
            //对左边进行mergeSort操作
            mergeSort(a,low,mid);
            //对右边进行mergeSort操作
            mergeSort(a,mid+1,high);
            //合并左右两部分
            merge(a,low,mid,high);
        }
    }

    void merge(int[] a,int low,int mid,int high){
        for(int i=low;i<=high;i++){
            //缓冲空间,
            buf[i]=a[i];
        }
        //i,j分别是左指针和右指针
        int i,j,k;
        //比较左右两边的元素,谁小谁放在前面
        for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){
            if(buf[i]<=buf[j])
                a[k]=buf[i++];
            else if(buf[i]>buf[j])
                a[k]=buf[j++];
        }
        //当一边全部比较完成后,另一边的元素就直接送到a的后面
        while(i<=mid)
            a[k++]=buf[i++];
        while(j<=high)
            a[k++]=buf[j++];
    }

复杂度 #

时间复杂度:O(nlogn)

空间复杂度:O(n)

稳定的排序算法