前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >排序算法之归并排序

排序算法之归并排序

作者头像
dejavu1zz
发布2020-10-23 15:14:08
2960
发布2020-10-23 15:14:08
举报

归并排序

归并排序是一种非常优秀的排序算法,时间复杂度仅为O(nlogn),与选择排序和冒泡排序的O(n2)相比较,只是将n这个因子替换成了logn,但这是非常划算的一个交易。但归并排序也有些不足,因为归并排序不是原址的,它必须将整个输入数组进行完全的拷贝,如果空间非常宝贵的话,不推荐使用归并排序。

先上代码吧

代码语言:javascript
复制
public class 归并排序 {
    public static void main(String[] args) {
        int[] t = {9, 5, 6, 1, 3, 2, 0, 19, 45, 30};
        sort(t, 0, t.length - 1);
    }

    public static void sort(int[] arr, int left, int right) {
        if (left == right) {
            return;
        }
        int mid = (left + right) >>> 1;
        sort(arr, left, mid);
        sort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }

    public static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        int index=0;
        int p1=left;
        int p2 = mid + 1;
        while (p1 <= mid && p2 <= right) {
            temp[index++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
        }
        while (p1 <= mid) {
            temp[index++] = arr[p1++];
        }
        while (p2 <= right) {
            temp[index++] = arr[p2++];
        }
        for (int i = 0; i < temp.length; i++) {
            arr[left + i] = temp[i];
        }
    }
}

归并排序采用了分治法。

在分治法中,我们将原问题分解为类似于原问题的子问题,并递归的求解这些子问题,然后再合并这些子问题的解来得出原问题的解。

当数组中只有一个元素时,此时数组一定是有序的,这是递归的基础情况。

下面来一组图片,更直观清晰的了解分解和合并的过程

分治
分治

动图演示

归并排序动图演示
归并排序动图演示

在归并排序上花费的比较久,因为发现自己对java的参数传递学习的还不够深入,所以又看了一遍java的参数传递。总的来说还不错,不仅掌握了一种新的排序算法,还加深了自己对java知识的了解。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 归并排序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档