归并排序的简单实现

一、排序过程

分为两个大步骤,分解和合并

分解

找到mid,然后分解即可,直到 left == right

合并

合并的思路是把每个小组比较后放入一个新的临时数组里,然后再赋值即可

二、代码实现

java 复制代码
    public static void mergeSort(int[] arr) {
        mergeSortTmp(arr,0,arr.length - 1);
    }
    //分解
    private static void mergeSortTmp(int[] arr, int left, int right) {
        if(left >= right) return;
        int mid = (left + right) / 2;
        mergeSortTmp(arr, left, mid);
        mergeSortTmp(arr, mid + 1, right);
        merge(arr,left,mid,right);
    }
    //合并
    private static void merge(int[] arr, int left, int mid, int right) {
        int[] tmp = new int[right - left + 1];
        int k = 0;
        int s1 = left;
        int s2 = mid + 1;
        while(s1 <= mid && s2 <= right) {
            if(arr[s1] >= arr[s2]){
                tmp[k++] = arr[s2++];
            }else{
                tmp[k++] = arr[s1++];
            }
        }
        while(s1 <= mid){
            tmp[k++] = arr[s1++];
        }
        while(s2 <= right){
            tmp[k++] = arr[s2++];
        }
        for(int i = 0;i < k;i++){
            arr[left+i] = tmp[i];
        }
    }

**arr[s1] >= arr[s2]**其实 换成 > ,结果也是一样的。但是如果真的出现向相等的情况,使用 > 的话,代码会多执行,从效率上考虑,选择 >= 时比较好的

三、非递归实现代码

java 复制代码
    public static void mergeSortNor(int[] arr) {
        int gap = 1;
        while(gap < arr.length){
            for(int i = 0;i < arr.length;i = i + gap * 2){
                int left = i;
                int mid = left + gap - 1;
                if(mid >= arr.length){
                    mid = arr.length - 1;
                }
                int right = mid + gap;
                if(right >= arr.length){
                    right = arr.length - 1;
                }
                merge(arr,left,mid,right);
            }
            gap *= 2;
        }
    }

在上面代码中加入这个方法即可,将分组的形式转变成以gap分组的形式进行

四、归并的特性

  1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。

  2. 时间复杂度:O(N*logN)

  3. 空间复杂度:O(N)

  4. 稳定性:稳定

相关推荐
‎ദ്ദിᵔ.˛.ᵔ₎17 小时前
LIST 的相关知识
数据结构·list
M--Y17 小时前
Redis常用数据类型
数据结构·数据库·redis
༾冬瓜大侠༿18 小时前
vector
c语言·开发语言·数据结构·c++·算法
汀、人工智能18 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****18 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能18 小时前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能18 小时前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo18 小时前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
汀、人工智能19 小时前
[特殊字符] 第76课:单词拆分
数据结构·算法·均值算法·前缀树·trie·单词拆分
ambition2024219 小时前
斐波那契取模问题的深入分析:为什么提前取模是关键的
c语言·数据结构·c++·算法·图论