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

归并排序

作者头像
Java架构师必看
发布2021-04-30 15:48:23
7680
发布2021-04-30 15:48:23
举报
文章被收录于专栏:Java架构师必看

归并排序

强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

一、归并排序的思想


【1】如下图,可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程。

二、归并排序案例


归并排序的应用案例:给你一个数组,val arr = Array(5,4,6,3,7,2,8,9,1,0,8,3), 请使用归并排序完成排序。

代码语言:javascript
复制
package com.algorithms;

import java.util.Arrays;

/**
 * 归并排序
 */
public class MergeSort {
    public static void main(String[] args) {
        int arr[] = new int[]{5,4,6,3,7,2,8,9,1,0,8,3};
        MergeSort mergeSort = new MergeSort();
        mergeSort.mergeSort(arr,0,arr.length-1,new int[arr.length]);
        System.out.printf(Arrays.toString(arr));
    }

    //分解数据 + 合并数据
    public void mergeSort(int arr[],int left,int right,int[] temp){
        if(left < right){
            int mid = (left + right)/2;
            //传入左区间
            mergeSort(arr,left,mid,temp);
            //传入右区间
            mergeSort(arr,mid+1,right,temp);
            //合并
            merge(arr,left,mid,right,temp);
        }
    }

    /*
     * 合并方法思想:【1】、将left——mid 之间的数据 与 mid+1——right 之间的数据进行比较,并顺序的放到 temp 中;
     * 【2】上述结束后,情况一:右边的数据遍历结束,但是左边的数据还有时,将左边的全部数据复制到temp中;
     *                 情况二:左边的数据遍历结束,但是右边的数据还有时,将右边的全部数据复制到temp中;
     */
    public void merge(int[] arr,int left,int mid,int right,int[] temp){
        //temp的下标
        int t = 0;
        //left 的值后续要用这里暂存起来
        int l = left;
        //因为右边的元素对mid进行了操作,所以这里需要获取传入的mid并锁死
        int m = mid;
        while(left <= m && mid+1 <= right){
            if(arr[left] < arr[mid+1]){
                temp[t] = arr[left];
                t++;
                left++;
            }else{
                temp[t] = arr[mid+1];
                t++;
                mid++;
            }
        }
        //情况一
        while(left <= m){
            temp[t] = arr[left];
            t++;
            left++;
        }
        //情况二
        while(mid+1 <= right){
            temp[t] = arr[mid+1];
            mid++;
            t++;
        }
        //将temp的值复制到arr中
        //先将temp的下标还原
        t=0;
        while(l <= right){
            arr[l] = temp[t];
            t++;
            l++;
        }
    }
}

三、总结


速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。 归并排序比较占用内存,但却是一种效率高且稳定的算法。改进归并排序在归并时先判断前段序列的最大值与后段序列最小值的关系再确定是否进行复制比较。如果前段序列的最大值小于等于后段序列最小值,则说明序列可以直接形成一段有序序列不需要再归并,反之则需要。所以在序列本身有序的情况下时间复杂度可以降至O(n)。传统归并排序的算法复杂度是O(nlogn)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、归并排序的思想
  • 二、归并排序案例
    • 三、总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档