美文网首页
一些常用排序算法的Java实现之归并排序

一些常用排序算法的Java实现之归并排序

作者: 一个努力生活的程序媛 | 来源:发表于2017-03-23 17:14 被阅读0次

概念

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,归并排序将两个已排序的表合并成一个表。

基本思想

归并排序是分治法的典型应用,那么分治法是什么?

分治法的精髓:
分--将问题分解为规模更小的子问题;
治--将这些规模更小的子问题逐个击破;
合--将已解决的子问题合并,最终得出“母”问题的解。

归并排序中的分,就是将待排序的序列切割,比如原来有8个数,分成4个一组,每个含4个元素的序列有序后,再合并使之成为最终有序的8个元素的序列。但是4个元素的排序依然是“复杂问题”,那么继续分割,直到分割成一个序列只有一个元素时子问题变得“可解”,因为一个元素就是有序序列嘛。

public void mergeSort(int[] a, int low, int high){
        int mid = (low + high)/2;
        if(low < high)//递归出口low=high说明一个序列只有一个元素
        {
            mergeSort(a, low, mid);//使左半序列有序
            mergeSort(a, mid + 1, high);//使右半序列有序
            merge(a, low, mid, high);//合并左右两半序列,使全序列有序
        }
    }

归并排序中的合,就是将已经有序的两个序列合并,使全序列有序。在合并时具体的做法是:
1、左右两个指针,开始时分别指向左右序列的起始位置;
2、比较指针所指向的两个元素,取出较小值放入新数组中;
3、取出数的那个序列指针后移;
4、重复步骤2,直到其中一个序列的数被取完为止;
5、若有序列还有数未被取完,则将这个序列直接接到新数组之后。

public int[] merge(int[] a, int low, int mid, int high){
        int[] temp = new int[high - low + 1];
        int l = low;
        int m = mid + 1;
        int k = 0;
        while (l <= mid && m <= high){
            if(a[l] <= a[m]){
                temp[k++] = a[l++];
            }else{
                temp[k++] = a[m++];
            }
        }
        while (l <= mid){
            temp[k++] = a[l++];
        }
        while (m <= high){
            temp[k++] = a[m++];
        }
        for(int i = 0; i < temp.length; i++){
            a[i + low] = temp[i];
        }
        return a;
    }

最后贴一个归并排序的递归过程图帮助理解。


相关文章

  • 排序算法的实现

    用java对常用内部排序算法的实现。 对冒泡排序,简单选择排序,直接插入排序,希尔排序,归并排序的简单实现(缺少快...

  • 2018-06-30

    排序算法之归并排序 归并排序算法是排序算法中的经典算法之一,其核心思想是利用归并的思想实现的排序方法,该算法采用经...

  • 归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用...

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 常用的排序算法

    常用的排序算法 常用的排序算法插入排序折半插入排序shell 排序冒泡排序选择排序快速排序基数排序归并排序堆排序K...

  • 十大经典排序算法(java实现)

    前言 本文我们将以java代码实现十大经典排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序...

  • 盘点常用Java排序算法

    本文主要介绍Java的七种常见排序算法的实现,对选择排序、插入排序、冒泡排序、归并排序、快速排序、希尔排序、最小堆...

  • 盘点常用Java排序算法

    本文主要介绍Java的七种常见排序算法的实现,对选择排序、插入排序、冒泡排序、归并排序、快速排序、希尔排序、最小堆...

  • 排序算法

    小胡子哥:聊一聊排序算法白话经典算法系列之五 归并排序的实现

网友评论

      本文标题:一些常用排序算法的Java实现之归并排序

      本文链接:https://www.haomeiwen.com/subject/phktottx.html