常用排序算法-归并排序

简介

  归并排序算法是基于归并操作的一种有效排序算法,是采用分治法的典型应用。归并排序算法将待排序序列分为若干个子序列,先对每个子序列进行排序,等每个子序列都有序后,再将有序子序列合并为整体的有序序列,若将两个有序表合并为一个有序表,则称之为二路归并。

原理

  归并排序的原理是将原始数组分解为多个子序列,然后对每个子序列进行排序,最后将排好序的子序列合并起来。

 

 

程序

public class MergeSort {
    public static void sort(int[] arr){
        mergeSort(arr, 0, arr.length - 1);
    }

    private static void mergeSort(int[] arr, int left, int right){
        if(left >= right)
            return;
        int mid = left + (right - left) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid+1, right);
        merge(arr, left, mid, right);
    }
    private static void merge(int[] arr, int left, int mid, int right){
        int[] tempArr = new int[right-left+1];
        int index = 0;
        int l = left, r = mid+1;
        while(l <= mid && r <= right){
            if(arr[l] <= arr[r])
                tempArr[index++] = arr[l++];
            else
                tempArr[index++] = arr[r++];
        }
        while(l <= mid)
            tempArr[index++] = arr[l++];
        while(r <= right)
            tempArr[index++] = arr[r++];
        for(int i = 0; i < tempArr.length; ++i)
            arr[left+i] = tempArr[i];
    }
}

总结

归并排序的时间复杂度最差为O(nlogn),最好情况时O(nlogn),平均时间复杂度为O(nlogn)。

归并排序空间复杂度O(n),因为需要临时数组保存合并的结果。

在序列合并的过程中,如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,所以,归并排序也是稳定的。

posted @ 2020-04-28 00:18  silentteller  阅读(237)  评论(0编辑  收藏  举报