首页 > 其他分享 >归并排序 (Merge Sort)

归并排序 (Merge Sort)

时间:2024-09-14 13:53:05浏览次数:12  
标签:Sort 归并 int Merge 数组 array 排序 left

 (1)算法简介

       归并排序是一种稳定的排序算法,采用分治策略,将待排序的数组分成若干子数组,分别对每个子数组进行排序,再将这些子数组合并成一个有序数组。归并排序的时间复杂度为 O(nlog⁡n),在数据量较大且对排序稳定性要求较高的场景中有较好的表现。


同样,我们接下来带着你边学如何实现排序算法边理解该算法的内核。


       (2)算法的原理与步骤

       归并排序的基本思想是将数组分成尽可能小的子数组(每个子数组只有一个元素),然后逐步合并这些子数组,使得合并后的数组有序。具体步骤如下:


分割: 将数组分成两部分,递归地对每一部分进行归并排序。


排序并合并: 当每个子数组的长度为1时,开始合并相邻的子数组。在合并时,使用双指针技术,比较两个子数组的元素,将较小的元素放入临时数组中。


递归处理: 对左右子数组分别递归应用归并排序,直至最终将所有元素合并为一个有序数组。


       


       ——看完了上述大体如何实现归并排序算法之后,让我们从代码的层面来实现一下快速排序算法。


       (3)Java代码实现

以下为Java中实现归并排序的大致代码:


public void mergeSort(int[] array) {

   // 调用归并排序的递归方法,排序整个数组

   mergeInsertSort(array, 0, array.length - 1);

}

public void mergeInsertSort(int[] array, int left, int right) {

   // 如果子数组只有一个元素或为空,则返回(递归终止条件)

   if (left >= right) {

       return;

   }

   // 计算中间位置,将数组分成两部分

   int mid = (left + right) / 2;

   // 对左半部分进行递归排序

   mergeInsertSort(array, left, mid);

   // 对右半部分进行递归排序

   mergeInsertSort(array, mid + 1, right);

   // 合并两个已排序的子数组

   merge(array, left, mid, right);

}

public void merge(int[] array, int left, int mid, int right) {

   // 右半部分的起始位置

   int rightBegin = mid + 1;

   // 左半部分的起始位置

   int leftBegin = left;

   // 用于存放合并结果的临时数组

   int i = 0;

   int[] ret = new int[right - left + 1];

   // 合并两个已排序的子数组

   while (left <= mid && rightBegin <= right) {

       // 比较左右两部分的元素,将较小的元素放入临时数组

       if (array[left] < array[rightBegin]) {

           ret[i++] = array[left++];

       } else {

           ret[i++] = array[rightBegin++];

       }

   }

   // 将左半部分剩余的元素添加到临时数组中

   while (left <= mid) {

       ret[i++] = array[left++];

   }

   // 将右半部分剩余的元素添加到临时数组中

   while (rightBegin <= right) {

       ret[i++] = array[rightBegin++];

   }

   // 将临时数组中的元素复制回原数组的相应位置

   for (int j = 0; j < ret.length; j++) {

       array[j + leftBegin] = ret[j];

   }

}

解释:


mergeSort(int[] array):这是归并排序的入口方法,它调用 mergeInsertSort 方法对整个数组进行排序。


mergeInsertSort(int[] array, int left, int right):这是归并排序的递归方法,递归地将数组分成更小的部分并排序,然后调用 merge 方法合并已排序的子数组。


merge(int[] array, int left, int mid, int right):这是合并两个已排序的子数组的方法。它创建一个临时数组 ret,将左右两部分按顺序合并到 ret 中,然后将合并后的结果复制回原数组。


       ——这样我们就了解了如何使用Java代码来实现归并排序算法。


       (4)时间复杂度和空间复杂度

时间复杂度: O(nlog⁡n)。每次分割将数组对半分,深度为 O(log⁡n),合并过程需要遍历整个数组,因此时间复杂度为 O(nlog⁡n)。


空间复杂度: O(n)。归并排序需要额外的空间来存储临时数组,用于合并过程中临时存放子数组的元素。


       


       (5)算法的应用场景

归并排序的稳定性和时间复杂度使其适用于以下场景:


稳定性要求高的排序: 归并排序是一种稳定排序算法,适用于对相同值的元素相对顺序有要求的场景。


外部排序: 归并排序适用于处理超大数据集的外部排序,由于其稳定性和性能,尤其适用于磁盘文件的排序操作。


数据集较大且未全部加载到内存: 在处理大规模数据时,归并排序由于其分割和合并的特性,可以有效地处理不能一次性加载到内存的数据。


       ——这样我们学习完了如何在Java中实现归并算法。


标签:Sort,归并,int,Merge,数组,array,排序,left
From: https://blog.51cto.com/u_16270487/12016308

相关文章

  • 计数排序 (Counting Sort)
    (1)算法简介    计数排序是一种非比较排序算法,主要用于对整数进行排序。它通过计算每个元素在数组中出现的次数来确定其在排序后数组中的位置。这种排序算法适用于元素范围较小且数据量较大的场景。同样,我们接下来带着你边学如何实现排序算法边理解该算法的内核。   ......
  • Spark-ShuffleWriter-BypassMergeSortShuffleWriter
    一、上下文《Spark-ShuffleWriter》中对ShuffleWriter的获取、分类和写入做了简单的分析,下面我们对其中的BypassMergeSortShuffleWriter做更详细的学习二、创建ShuffleMapOutputWriterShuffleMapOutputWritermapOutputWriter=shuffleExecutorComponents.createMapO......
  • MERGE INTO
    MERGEINTO是SQL中的一种语句,主要用于合并(或称为“合并插入”)数据。这种语句通常用于将数据从一个源表合并到一个目标表中,并在目标表中进行插入、更新或删除操作。MERGEINTO的基本语法如下:sqlCopyCodeMERGEINTOtarget_tableAStargetUSINGsource_tableASsourceON......
  • SortableTableView:Android 表格视图库
    在Android应用开发中,提供用户交云和数据展示的功能是非常重要的。SortableTableView是一个开源的Android库,它提供了一个简单的TableView组件以及一个更高级的可排序TableView,允许开发者实现复杂的表格视图和数据排序功能。文章目录......
  • SQL 高级语法 MERGE INTO
    根据与源表相联接的结果,对目标表进行插入、更新、删除等操作。例如,对目标表,如果源表存在的数据则更新,没有的则插入,就可以使用MEREG进行同步。基本语法MERGEINTOtarget_tableUSINGsource_tableONconditionWHENMATCHEDTHENXXXWHENNOTMATCHEDTHENXXX这里的Sour......
  • 洛谷题单指南-分治与倍增-P1177 【模板】归并排序
    原题链接:https://www.luogu.com.cn/problem/P1177题意解读:归并排序模版题。解题思路:第一步:确定分界点。mid=(l+r)/2第二步:排序。对左右两边递归排序第三步:归并。合并左右两边排序好的内容关键在第三步:通过双指针对两个有序数组进行合并100分代码:#include<bits/std......
  • git 中止merge
    今天的项目工程文件产生了冲突,没办法,显示包内容。三下五除二把冲突解决了,结果发现项目的project文件还是不能打开,但是已经无法回归到解决冲突之前的状态了。怎么办,问了公司的大牛,执行gitmerge--abort命令回到解决冲突之前的状态。再重新执行gitpull操作。重新解决冲突,注意看仔......
  • 【数据结构】详细介绍各种排序算法,包含希尔排序,堆排序,快排,归并,计数排序
    目录1.排序1.1概念1.2常见排序算法2.插入排序2.1直接插入排序2.1.1基本思想2.1.2代码实现2.1.3特性2.2 希尔排序(缩小增量排序)2.2.1基本思想2.2.2 单个gap组的比较2.2.3 多个gap组比较(一次预排序)2.2.4 多次预排序2.2.5 特性3.选择排序3.1直......
  • 《Java 归并排序:高效稳定的排序算法》
      一、归并排序简介介绍归并排序是一种基于分治思想的经典排序算法,适用于各种规模的数据排序任务。 二、算法原理(一)分治策略将未排序数组分割成两个子数组,递归地对子数组进行排序,最后合并成有序数组。(二)关键步骤1.分割阶段:将数组分成两个子数组,通常是平均分割。2.......
  • [LeetCode] 2181. Merge Nodes in Between Zeros
    Youaregiventheheadofalinkedlist,whichcontainsaseriesofintegersseparatedby0's.ThebeginningandendofthelinkedlistwillhaveNode.val==0.Foreverytwoconsecutive0's,mergeallthenodeslyinginbetweenthemintoasing......