查找与排序-归并排序

news/2024/10/5 10:15:55/

排序算法可以分为内部排序和外部排序,

内部排序是数据记录在内存中进行排序,

外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存

常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。代价是需要额外的内存空间。若将两个有序表合并成一个有序表,称为2-路归并。 该算法时间复杂度为O(n log n)。

算法的原理如下:

  1. 将待排序的线性表不断地切分成若干个子表,直到每个子表只包含一个元素,这时,可以认为只包含一个元素的子表是有序表。
  2. 将子表两两合并,每合并一次,就会产生一个新的且更长的有序表,重复这一步骤,直到最后只剩下一个子表,这个子表就是排好序的线性表。

假设我们有一个初始数列为{8, 4, 5, 7, 1, 3, 6, 2},整个归并排序的过程如下图所示。

算法性能

速度仅次于快速排序。

时间复杂度

O(nlogn)

空间复杂度

O(N),归并排序需要一个与原数组相同长度的数组做辅助来排序。

稳定性

稳定

// 归并排序
void MergeSort(int arr[], int start, int end, int * temp) // start和end分别是左边界和右边界
{if (start >= end)return;int mid = (start + end) / 2;MergeSort(arr, start, mid, temp);MergeSort(arr, mid + 1, end, temp);// 合并两个有序序列int length = 0; // 表示辅助空间有多少个元素int i_start = start;int i_end = mid;int j_start = mid + 1;int j_end = end;while (i_start <= i_end && j_start <= j_end){if (arr[i_start] < arr[j_start]){temp[length] = arr[i_start]; length++;i_start++;}else{temp[length] = arr[j_start];length++;j_start++;}}while (i_start <= i_end)  // 把剩下数的合并{temp[length] = arr[i_start];i_start++;length++;}while (j_start <= j_end){temp[length] = arr[j_start];length++;j_start++;}// 把辅助空间的数据放到原空间for (int i = 0; i < length; i++){arr[start + i] = temp[i];}
}

http://www.ppmy.cn/news/1533844.html

相关文章

remote table dblink no_merge提升性能

-----------remote table DML DDL 不能使用DRIVING_SITE hints------ DRIVING_SITE hint is not working for DML or DDL. Remember DRIVING_SITE hint is for query optimization and not intended for DML or DDL, as a distributed DML statement must execute on the data…

大数据实时数仓Hologres(三):存储格式介绍

文章目录 存储格式介绍 一、格式 二、使用建议 三、技术原理 1、列存 2、行存 3、行列共存 四、使用示例 存储格式介绍 一、格式 在Hologres中支持行存、列存和行列共存三种存储格式,不同的存储格式适用于不同的场景。在建表时通过设置orientation属性指定表的存储…

「小土堆」pytorch DataSet

「小土堆」pytorch DataSet from cProfile import labelfrom torch.utils.data import Dataset from PIL import Image import osclass MyData(Dataset):def __init__(self, root_dir, label_dir):# root_dir "hymenoptera_data/train"# label_dir "ants_img…

通信工程学习:什么是LAN局域网、MAN城域网、WAN广域网

LAN局域网、MAN城域网、WAN广域网 LAN&#xff08;Local Area Network&#xff0c;局域网&#xff09;、MAN&#xff08;Metropolitan Area Network&#xff0c;城域网&#xff09;和WAN&#xff08;Wide Area Network&#xff0c;广域网&#xff09;是计算机网络中根据覆盖范围…

JAIN SLEE 中的 Event Element

JAIN SLEE 中的 Event Elements 在 JAIN SLEE&#xff08;Service Logic Execution Environment&#xff09;中&#xff0c;event 元素用于定义 SBB&#xff08;Service Building Block&#xff09;可以接收或触发的事件。以下是对 event 元素及其子元素的详细说明&#xff0c…

Vue3 组件中使用 SCSS 变量

在 JavaScript 中不能直接使用 SCSS 变量。但是可以通过一些间接的方法来实现类似的效果。 一、使用 sass-extract 使用 sass-extract 库来提取 SCSS 变量并生成 JSON 文件&#xff0c;然后在 JavaScript 中读取这个 JSON 文件来获取变量值。 1. 安装 sass-extract npm ins…

宠物饮水机的水箱低液位提醒如何实现?

ICMAN液位检测芯片轻松实现宠物饮水机的水箱低液位提醒功能&#xff01; 工作原理 &#xff1a; 基于双通道电容式单点液位检测原理 方案特点&#xff1a; 液位检测精度高达1mm&#xff0c;超强抗干扰&#xff0c;动态CS 10V 为家用电器水位提醒的应用提供了一种简单而又有…

谷粒商城のOAuth2.0单点登录

文章目录 前言一、账号密码登录1、整合短信验证2、验证码校验&防止重复获取验证 二、社交登录1、第三方平台设置2、代码整合3、整体效果演示4、补充&#xff1a;其他模式 三、Session共享问题1、引入Spring Session2、配置Spring Session 四、单点登录 前言 本篇主要介绍谷…