栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

持续输出面试题之算法--归并排序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

持续输出面试题之算法--归并排序

开篇介绍

大家好,我是Java最全面试题库的提裤姐,今天这篇是数据结构与算法的第四篇,主要介绍归并排序;在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。

归并排序

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

  • 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
  • 自下而上的迭代;

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

特性:

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(n)
  • 稳定性:稳定

实现:

public class MergeSort {
    public int[] sort(int[] sourceArray) throws Exception {
 // 对 arr 进行拷贝,不改变参数内容
 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

 if (arr.length < 2) {
     return arr;
 }
 int middle = (int) Math.floor(arr.length / 2);

 int[] left = Arrays.copyOfRange(arr, 0, middle);
 int[] right = Arrays.copyOfRange(arr, middle, arr.length);

 return merge(sort(left), sort(right));
    }

    protected int[] merge(int[] left, int[] right) {
 int[] result = new int[left.length + right.length];
 int i = 0;
 while (left.length > 0 && right.length > 0) {
     if (left[0] <= right[0]) {
  result[i++] = left[0];
  left = Arrays.copyOfRange(left, 1, left.length);
     } else {
  result[i++] = right[0];
  right = Arrays.copyOfRange(right, 1, right.length);
     }
 }

 while (left.length > 0) {
     result[i++] = left[0];
     left = Arrays.copyOfRange(left, 1, left.length);
 }

 while (right.length > 0) {
     result[i++] = right[0];
     right = Arrays.copyOfRange(right, 1, right.length);
 }
 return result;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/238474.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号