美文网首页
【排序算法】6.归并排序

【排序算法】6.归并排序

作者: bit_拳倾天下 | 来源:发表于2022-05-15 23:16 被阅读0次

归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。
将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。

将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。

分支思想
image.png

java 实现:

public class MergeSortTest {
    public static void main(String[] args) {
        int[] input = {2,5,4,89,20,89,6,0,54,78,2};
        int[] temp = new int[input.length];
        mergeSort(input, 0, input.length-1, temp);
        PrintUtils.print(input);
        PrintUtils.print(temp);
    }

    public static void mergeSort(int[] arr, int left, int right, int[] temp){
        //拆分到只剩下一个元素(也就是left == right)就跳过
        if (left < right){
            /*
             * 1.拆分
             * 将数组的 left 到 right 区间的元素,逻辑上拆分为左右两部分 2,5,4,89,20,89 和 6,0,54,78,2
             */
            int middle = (right + left)/2;
            mergeSort(arr, left, middle, temp);
            mergeSort(arr, middle + 1, right, temp);
            int t = 0;
            /*
             * 2.合并
             * left 到 right 区间的元素,在逻辑上已经分为了左右两部分
             * 并且,这两个部分经过重新排列,各自都是有序的,例如:左侧是 2,4,5,20,89,89 ,右侧是 0,2,6,54,78
             * 然后,分别从左侧和右侧取出一个元素,并将采用数值小的一个放入 temp,被采用的一方再取出一个元素,和刚才未被采用的元素比较,再选一个小的放到temp
             * 再然后,如果一方的元素已经都放入到了temp,那么把另一方的元素依次放入到temp中即可(因为单个看某一侧都是有序的)
             * 最后,将temp中的元素回写到 arr 中,arr就完成了 left 到 right 区间的排序,如此往复即可完成排序
             */
            int l = left;
            int r = middle + 1;
            //从左右两侧各取出一个元素,将小的放入temp
            while (l <= middle && r <= right){
                if (arr[l] < arr[r]){
                    temp[t++] = arr[l++];
                }else {
                    temp[t++] = arr[r++];
                }
            }
            //退出循环,说明由一方已经将全部元素存入temp,需要将另一方剩余的元素存入temp
            while (l <= middle){
                temp[t++] = arr[l++];
            }
            while (r <= right){
                temp[t++] = arr[r++];
            }
            //最后将temp回写到arr
            int copyPointer = left;
            t = 0;
            while (copyPointer <= right){
                arr[copyPointer++] = temp[t++];
            }
        }
    }
}

时间复杂度

  • 最优时间复杂度:O(nlogn)
  • 最坏时间复杂度:O(nlogn)
  • 稳定性:稳定

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • 2018-06-30

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

  • 排序算法之归并排序

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

  • 归并排序

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

  • 算法入门——归并排序、希尔排序

    上篇文章我们学习了算法入门——堆排序,这篇文章我们学习算法入门——归并排序、希尔排序。 归并排序 归并排序是将一个...

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 归并排序

    归并排序(Merge Sort): 归并排序是一个相当“稳定”的算法对于其它排序算法,比如希尔排序,快速排序和堆排...

  • 算法 第二章第二部分笔记

    各种排序算法的性能特点 选择排序 插入排序 希尔排序 归并排序 本地归并排序 自底向上的归并排序 快速排序 三向切...

  • 归并排序

    归并排序 这个排序算法是建立在归并操作上的一种有效的排序算法,算法主要采用分治法,归并排序的算法复杂度为O(n*l...

  • 归并排序

    归并排序 归并排序(Mergesort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分...

网友评论

      本文标题:【排序算法】6.归并排序

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