• 归并排序的简单理解


    详细描述

    归并排序的基本思想是,将已有序的子序列合并,可以得到有序的完整序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

    归并排序详细的执行步骤如下:

    1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
    2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
    3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
    4. 重复步骤 3 直到某一指针超出序列尾。

    算法图解

    归并排序

    问题解疑

    归并排序和快速排序比较怎么样?

    归并排序的比较次数小于快速排序的比较次数,移动次数一般多于快速排序的移动次数。

    归并排序的应用在什么场景?

    归并排序速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的序列。

    归并排序的时间复杂度是多少?

    每次合并操作的平均时间复杂度为 O(n),而完全二叉树的深度为 log2n,总的平均时间复杂度为 O(nlogn)

    并且,归并排序的最好、最坏、平均时间复杂度均为 O(nlogn)

    代码实现

    package cn.fatedeity.algorithm.sort;
    /**
    * 归并排序算法
    */
    public class MergeSort {
    private static void merge(int[] numbers, int low, int mid, int high) {
    int i = low;
    int j = mid + 1;
    int[] newNumbers = new int[high - low + 1];
    int k = 0;
    while (i <= mid && j <= high) {
    if (numbers[i] < numbers[j]) {
    newNumbers[k++] = numbers[i++];
    } else if (numbers[i] > numbers[j]) {
    newNumbers[k++] = numbers[j++];
    } else {
    newNumbers[k++] = numbers[i++];
    newNumbers[k++] = numbers[j++];
    }
    }
    while (i <= mid) {
    newNumbers[k++] = numbers[i++];
    }
    while (j <= high) {
    newNumbers[k++] = numbers[j++];
    }
    if (high + 1 - low >= 0) {
    System.arraycopy(newNumbers, 0, numbers, low, high + 1 - low);
    }
    }
    private static int[] sort(int[] numbers, int low, int high) {
    if (low < high) {
    int mid = (low + high) >> 1;
    sort(numbers, low, mid);
    sort(numbers, mid + 1, high);
    merge(numbers, low, mid, high);
    }
    return numbers;
    }
    public static int[] sort(int[] numbers) {
    return sort(numbers, 0, numbers.length - 1);
    }
    }
  • 相关阅读:
    JMeter 调试取样器(Debug Sampler)简介
    大数据Doris(二十五):数据导入演示和其他导入案例
    java-php-python-ssm学生综合测评系统计算机毕业设计
    基于Springboot的地方美食分享网站(有报告)。Javaee项目,springboot项目。
    第5篇:Java基础语法
    从零开始带你编写属于自己的 Starter
    Android SystemUI setSystemUiVisibility()参数Flag详解
    第7章 - 多无人机系统的协同控制 --> 实验验证
    第14章 结构和其他数据形式
    C++学习笔记(三十五)
  • 原文地址:https://www.cnblogs.com/fatedeity/p/16407530.html