二路归并排序(基于分治的思想,先分解再合并)

  算法思想:先分解,然后两两归并,直到合成一个新的有序表。
  相关代码如下:

 // 归并排序:先分解再合并void Merge_sort(int[] array, int left, int right) {if (left >= right)return;// 1.分解int mid = (left + right) / 2; // 从中间划分成两个待排子序列Merge_sort(array, left, mid); // 对左侧序列进行递归排序left~midMerge_sort(array, mid + 1, right); // 对右侧序列进行递归排序(mid+1)~right// 2.合并Merge(array, left, mid, right); // 把左右两边的子序列合并在一起}// 合并算法void Merge(int[] array, int left, int mid, int right) {// 分别用s1、s2标记两个待排子序列的起始下标位置int s1 = left;int s2 = mid + 1;// 用len表示array数组的长度int len = right - left + 1;// 设置一个临时数组,存放排好的序列int[] ret = new int[len];int i = 0; // i表示ret数组的下标// 两边子序列都有元素时while (s1 <= mid && s2 <= right) {if (array[s1] <= array[s2]) {// 左边序列元素的值小于右边的,就把左边元素的值放到ret中,并更新i和s1ret[i++] = array[s1++];} else {// 反之,就把右边元素的值放到ret中,并更新i和s2ret[i++] = array[s2++];}}// 处理剩下有元素的待排子序列while (s1 <= mid) {ret[i++] = array[s1++];}while (s2 <= right) {ret[i++] = array[s2++];}// 把排好的序列放回到原数组中for (int j = 0; j < ret.length; j++) {array[left + j] = ret[j]; // array数组的起始下标为left}}/** 归并排序 * 时间复杂度:O(nlogn) * 空间复杂度:O(n) * 稳定性:稳定*/

[归并排序] 二路归并排序相关推荐

  1. 排序算法之——二路归并排序

    排序算法之--二路归并排序 二路归并排序的思想: 一次排序过程,将已经各自有序的两个段的数据合并一个段,并且合并后依旧有序 开始,我们认为单个数据是有序的,一个数据就是一个段,一次排序之后,两个数据就 ...

  2. 数据结构源码笔记(C语言):二路归并排序

    //实现二路归并排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20 //线性表中最多元素个数typedef int ...

  3. 二路归并排序简介及其并行化

    1.归并排序简介 1.1算法思想 归并排序属于比较类非线性时间排序,比较类排序中性能最佳,应用较为广泛. 归并排序是分治法(Divide and Conquer)的一个典型的应用.将已有序的子序列合并 ...

  4. C++实现二路归并排序算法

    排序算法分为五大类,一共是有九种,如下: 插入类:直接插入排序.折半插入排序.希尔排序 交换类:冒泡排序.快速排序 选择类:简单选择排序.堆排序 归并类:二路归并排序 基数类:多关键字排序 九种算法的 ...

  5. 二路归并排序原理及JAVA实现

    归并类排序 基本思想:首先将原始无序序列划分为两个子序列,然后分别对每个子序列递归地进行排序,最后再将有序子序列合并. 归并排序基于分治策略思想.前面提到的基于分治的快速排序重在"分&quo ...

  6. 二路归并排序及时间复杂度分析

    序言 二路归并排序是一种效率极高的递归排序,将数组A化为有序数组时间复杂度为O(nlogn). 思想 二路归并排序分为拆分数组以及合并两个操作. 切分(自上而下)时间复杂度2*T(n/2) 每次从数组 ...

  7. 二路归并排序Python实现-III

    二路归并排序Python实现-III 归并排序 是一种 效率比较高并且稳定的算法.时间复杂度 O(NLog(N)),空间复杂度 O(N). 归并排序(Merge Sort)是建立在归并操作上的一种有效 ...

  8. 数据结构——二路归并排序和基数排序

    二路归并排序 算法原理 假设该数组为q,左边界为 l,右边界为 r,并设置临时数组tmp. 采用分治思想: 第一步:确定分界点: mid = l + r >>1. 第二步:递归划分左右两段 ...

  9. Sort List(二路归并排序)

    题目链接:https://leetcode.com/problems/sort-list/description/ 题目要求:对链表进行排序,时间复杂度O(n),常数的空间复杂度 两种解法,本质上都是 ...

  10. 二路归并排序 Implemented With C++

    文章目录 Definition Implementation Performance Definition 对于一个长度为 n n n 的表,我们可以把这张表看成是由 n n n 个长度为 1 1 1 ...

最新文章

  1. 双塔模型没效果了?请加大加粗!
  2. fastDFS分布式文件系统--文件上传/下载/查询完整代码实现
  3. Linux 最常用命令
  4. Flink SQL的N way join
  5. matlab lpfilter.m,histroi/statmoments/lpfilter/dftuv的Matlab程序
  6. Oracle入门(十二)之SQL的DDL
  7. sql server使用杂记
  8. 智慧交通day04-特定目标车辆追踪02:Siamese网络+单样本学习
  9. 调试器工作原理--CPU软件断点/硬件断点/单步执行标识
  10. 特斯拉又有新游戏可以玩了 网友:行车打游戏,亲人两行泪
  11. attodiskbenchmarks(磁盘传输速率检测)_硬盘坏了可以修复吗?电脑硬盘检测?
  12. Linux操作系统原理与应用06:系统调用
  13. js中获取时间new date()的用法和获取时间戳
  14. raspberrypi 与 arduino 使用 nRF24L01+ 通信 -- arduino为接收端
  15. CCF CSP 201503-1 图像旋转
  16. SQL循环算出移动加权平均
  17. wps如何只让他显示3级标题_WPS如何三级标题
  18. 主存空间的分配和回收实验报告
  19. 在埋头写程序学技术的同时,有没有想到你们的老板和上司在搞什么?
  20. mstar的android方案,Mstar Android 方案.pdf

热门文章

  1. Java自学第15天 面向对象(全)
  2. Linux系统tomcat修改端口
  3. Tomcat 修改端口
  4. C++信息学奥赛一本通_2060
  5. Linux中PLSQL视频,PLSQL使用视频教程:PLSQL的使用方法
  6. js书写原生ajax,javascript原生ajax写法
  7. 摄影后期从入门到精通(一)
  8. 新版gsp计算机系统全套资料,新版GSP对计算机系统的需求表
  9. CAD迷你画图2020R11
  10. PyCharm怎么来更新pip