归并排序

基本思想

归并排序是建立在归并操作上的一种有效的排序算法。

该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

将一个数组分为越来越小的子列表,每个子列表单独进行排序,然后合并形成更大的有序列表。

通过归并子列表元素来合并子列表就是归并排序(Merge Sort)

代码实现

package com.csdhsm.sort;

public class MergeSort {
    
    public void sort(int[] arr,int low,int high){
        
        int mid = (low + high)/2;
        if(low < high){
            
            sort(arr,low,mid);
            sort(arr,mid+1,high);
            mergeSort(arr,low,mid,high);
        }
    }
    
    private void mergeSort(int[] arr,int low,int mid,int high){
        
        /**
         * 用于存放归并好的数组 
         */
        int[] copyArr = new int[high - low + 1];
        
        int i = low;
        int j = mid + 1;
        int k = 0;
        
        /**
         * 比较两个有序序列
         */
        while(i<=mid&&j<=high){
            
            if(arr[i] <= arr[j]){
                
                copyArr[k] = arr[i];
                i++;
            }else{
                
                copyArr[k] = arr[j];
                j++;
            }
            
            k++;
        }
        
        /**
         * 下面两个循环只会执行一个
         */
        while(i<=mid){
            
            copyArr[k] = arr[i];
            i++;
        }
        
        while(j<=high){
            
            copyArr[k] = arr[j];
            j++;
        }
        
        for(i=0;i<=k;i++){
            
            arr[low+i] = copyArr[i];
        }
    }
}

效率分析

稳定

空间复杂度:O(n)

时间复杂度:O(nlog2n)

最坏情况:O(nlog2n)

最好情况:O(nlog2n)

原文地址:https://www.cnblogs.com/a294098789/p/5349952.html