十大排序算法-归并排序

归并排序(Merge Sort)

原理:采用递归思想,分而治之。将数组从中间分割成两部分数组进行排序,其中左半部分和右半部分又递归式进行分割排序,直到分割后的数组只剩两个元素,再逐级向上返回排序好的结果。

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法。

逻辑代码

public class MergeSort {

    public static void main(String[] args) {
        int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
        sort(arr,0,arr.length-1);
        Utils.printArr(arr);
    }

    public static void sort(int[] arr, int left, int right) {
        if (left >= right) return;
        //分成两半
        int mid = left + (right - left) / 2;
        //左边排序
        sort(arr, left, mid);
        //右边排序
        sort(arr, mid + 1, right);
        merge(arr, left, mid + 1, right);
    }

    public static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        int i = left;//左边数组开始位置
        int j = mid+1;//右边数组开始位置
        int k = 0;  //新数组开始位置
        while (i <= mid && j <= right) {
            //如果左边数组当前下标对应值 小于 左边数组当前下标对应值,新数组赋值左边下标当前值,否则赋值右边下标当前值
            if (arr[i] <= arr[j]) {
                temp[k++] = arr[i++];
            } else {
                temp[k++] = arr[j++];
            }
        }
        // 把左边剩余的数移入数组
        while (i <= mid) temp[k++] = arr[i++];
        // 把右边边剩余的数移入数组
        while (j <= right) temp[k++] = arr[j++];
        // 把新数组中的数覆盖arr数组中的当前排序部分
        for (int m = 0; m < temp.length; m++) {
            arr[left + m] = temp[m];
        }

    }
}

2.演示图:
演示图片为转载,转载地址:https://www.runoob.com/w3cnote_genre/algorithm
在这里插入图片描述

总结

时间复杂度(平均) 时间复杂度(最好) 时间复杂度(最坏) 空间复杂度 稳定性
O(nlogn O(nlogn) O(nlogn) O(n) 稳定
发布了41 篇原创文章 · 获赞 13 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章