当前位置: 首页 > article >正文

查找与排序-归并排序

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

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

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

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

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(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.kler.cn/a/330114.html

相关文章:

  • 学成在线_内容管理模块_创建模块工程
  • .net core 中使用AsyncLocal传递变量
  • Vue2+OpenLayers添加/删除点、点击事件功能实现(提供Gitee源码)
  • 【计算机网络】深入浅出计算机网络
  • Kafka——两种集群搭建详解 k8s
  • Grails应用http.server.requests指标数据采集问题排查及解决
  • rabbitMq-----broker服务器
  • 解决nginx+tomcat宕机完美解决方案
  • 【数据结构】堆(Heap)详解----定义堆、初始化,删除、插入、销毁、判空、取堆顶
  • 试用Foxit PDF: 在网页中单页展示PDF
  • 计算机网络期末复习真题(附真题答案)
  • 构建.NET Core Web API为Windows服务安装包
  • 配置Scrapy项目
  • 3、AI测试辅助-测试计划编写(自动生成任务甘特图)
  • [C#]C# winform部署yolov11目标检测的onnx模型
  • 计算机毕业设计 基于Python的音乐平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • 每天五分钟深度学习PyTorch:如何使用GPU来跑深度学习算法模型?
  • 力扣(leetcode)每日一题 2516 每种字符至少取 K 个 | 滑动窗口
  • ESP32简介
  • 我博客网站又遭受CC攻击了,记录一下
  • JAVAIDEA初始工程的创建
  • cMake学习笔记(初级使用)
  • SpringBoot开发——Spring Security中获取当前登录用户信息的方式
  • 初识chatgpt
  • C++ 矩阵拼接相关问题记录
  • 在Linux中创建检查点并还原的工具——criu