程序分享--排序算法--归并排序

关注我,持续分享逻辑思维&管理思维; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;
有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》《做好面试准备,迎接2024金三银四》。

-------------------------------------正文----------------------------------------

归并排序:概述

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

归并排序:算法描述

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

方法二、迭代法(Bottom-up),原理如下(假设序列共有n个元素):
将序列每相邻两个数字进行归并操作,形成ceil(n/2)个序列,排序后每个序列包含两/一个元素
若此时序列数不是1个则将上述序列再次归并,形成ceil(n/4)个序列,每个序列包含四/三个元素
重复步骤2,直到所有元素排序完毕,即序列数为1.

#include<iostream>void Merge(int* vec, int start, int mid, int end) 
{int leftIndex = start;int rightIndex = mid + 1;int temp[end-start+1];int tempIndex = 0;while (leftIndex <= mid && rightIndex <= end) {if (vec[leftIndex] <= vec[rightIndex]) {temp[tempIndex++] = vec[leftIndex++];}else {temp[tempIndex++] = vec[rightIndex++];}}while (leftIndex <= mid) {temp[tempIndex++] = vec[leftIndex++];}while (rightIndex <= end) {temp[tempIndex++] = vec[rightIndex++];}for (int i = start; i <= end; i++) {vec[i] = temp[i - start];}
}void MergeSort(int* vec, int start, int end) 
{if (start >= end)return;int mid = (start + end) / 2;MergeSort(vec, start, mid);MergeSort(vec, mid + 1, end);Merge(vec, start, mid, end);
}int main() {int vec = { 4,8,9,2,100,400,20,7,17,31,22,0,1,55,30 };cout << "归并排序前:";for (int i = 0; i < 15; i++)cout << vec[i] << ' ';cout << std::endl;MergeSort(vec, 0, 14);cout << "归并排序后:";for (int i = 0; i < 15; i++)cout << vec[i] << ' ';cout << std::endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统--LRU算法,手撕

今天研究一下LRU算法&#xff0c;上学期学数据结构的时候就应该学一下这个算法&#xff0c;不过后面操作系统也会讲到LRU算法 题目 LRU缓存leetocde146 LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;算法是一种常见的缓存替换算法&#xff0c;通…

windows系统图标变白设置

我们在使用系统的时候&#xff0c;通常会在桌面创建图标&#xff0c;有时候桌面图标过多&#xff0c;整理图标放在新建文件夹的时候&#xff0c;图标变白&#xff0c;通常情况下都是缓存问题&#xff0c;这里也是删除缓存解决演示系统&#xff1a;windows11 1显示图标缓存目录 …

保护数字前沿:有效的威胁暴露管理

人工智能技术正在从根本上改变网络安全领域的方向。仅 2023 年&#xff0c;全球企业预计将在人工智能上花费 1027.8 亿美元&#xff0c;以阻止网络安全威胁。 人工智能 (AI)在增强网络安全措施方面发挥着关键作用&#xff0c;因为它能够快速分析大量数据并识别可能表明潜在威胁…

Unity 显示MeshRenderer的渲染层级

Unity 显示MeshRenderer的渲染层级 前言源码MeshRendererInspectorSkinnedMeshRendererInspector 参考 前言 Mesh Renderer和Skinned Mesh Renderer组件默认不显示Order&#xff0c;找了个工具显示一下。 源码 下面两个代码放入Editor文件夹中 MeshRendererInspector Me…

vue的导入

import { onMounted, onUpdated, onUnmounted } from ‘vue’; 单一导出&#xff08;不使用 {}&#xff09;&#xff1a;通常用于导入vue组件 当一个模块只导出一个内容时&#xff0c;可以直接导入&#xff0c;无需使用 {}。多个导出&#xff08;使用 {}&#xff09;&#xff…

代码随想录day34 Java版

416. 分割等和子集 我们的目标是尝试从这些数字中选取一部分数字&#xff0c;使得它们的和恰好等于数组总和的一半。这相当于在背包容量为总和的一半的情况下&#xff0c;尝试装入物品&#xff0c;看是否能够恰好装满背包。 class Solution {public boolean canPartition(int…

Linux无分区表

前言 最近我在研究pve bcache &#xff0c;发现了bcache默认创建的分区bcache0默认的分区是MBR 也就是说&#xff0c;这个分区最大只能存2T数据&#xff0c;我硬盘是6T的&#xff0c;浪费了很多空间 解决 rootpve:~# fdisk /dev/bcache0 Welcome to fdisk (util-linux 2.38…

C++Qt学习——不用UI文件编程

在创建文件的时候不要选中Generate form这块 创建的文件如下图所示&#xff0c;比起之前的没有了form这一快 1、在mainwindow.h里面声明按钮对象 2、在mainwindow.cpp里实例化按钮 2.1、方法一 pushButton new QPushButton();pushButton->show(); 但是发现显示是分离的 2…

【spring】-多模块构建二-问题整理

1、bean注入问题 The injection point has the following annotations: - org.springframework.beans.factory.annotation.Autowired(requiredtrue) 解决1&#xff1a; 由于引入的bean类 不属于启动类的子模块下&#xff0c;需要在启动类手动声明扫描的类 也适用于公共子模…

【图文详解】Maven Helper插件解决Maven冲突

文章目录 插件问题解决过程 在面试中解决问题的能力和思路是考察的重点&#xff0c;面试官问会问我们有没有解决过maven冲突。以下造了一个maven冲突&#xff0c;手把手教学如何解决Maven冲突。 插件 插件在idea插件中搜索Maven Helper 问题 解决过程 根据上面日志知道是log…

触发器

触发器的用途1 利用触发器检查输入数据的合理性 利用触发器维护冗余数据查看触发器 一、为什么使用触发器 触发器&#xff08;TRIGGER&#xff09;是MySQL的与表的insert&#xff0c;delete&#xff0c;update语句相关的数据库对象之一&#xff0c;当表上出现特定事件时&#…

2024 遗传编程实战(一)基因实战

2024 遗传编程实战&#xff08;一&#xff09;基因实战 文章目录 2024 遗传编程实战&#xff08;一&#xff09;基因实战一、遗传编程实战介绍1、遗传编程简介2、遗传编程和进化论的关系3、遗传编程过程解释 二、基于遗传编程的例子1、实战题目介绍2、遗传算法的伪代码3、遗传实…

Vue中吸顶导航的实现

目录 1 前言 2 具体步骤 2.1 安装VueUse 2.2 吸顶导航组件中导入useScroll 2.3 在style中定义吸顶导航的两种状态 2.4 template中设置吸顶导航出现的时机 1 前言 本处使用VueUse更便捷的实现吸顶导航&#xff0c;具体内容及更多操作请看官网文档&#xff0c;如下&#x…

从键盘输入两个数,求它们的和并输出 从键盘输入三个数到a,b,c中,按公式值输出

别急别急&#xff0c;先看完 (从初学者出发&#xff0c;大佬勿喷&#xff0c;I am 小小蒟蒻&#xff09; 从键盘输入两个数&#xff0c;求它们的和并输出 作者 陈春晖 单位 浙江大学 本题目要求读入2个整数A和B&#xff0c;然后输出它们的和。 输入格式: 在一行中给出一…

微信小程序开发系列(三十)·小程序本地存储API·同步和异步的区别

目录 1. 同步API 1.1 getStorageSync存储API 1.2 removeStorageSync获取数据API 1.3 removeStorageSync删除 1.4 clearStorageSync清空 2. 异步API 2.1 setStorage存储API 2.2 getStorage获取数据API 2.3 removeStorage删除API 2.4 clearStorage清空 3. …

每天学习一个Linux命令之ifconfig

每天学习一个Linux命令之ifconfig 在Linux操作系统中&#xff0c;ifconfig命令是一个用来配置和显示网络接口的工具。它可以用来查看和修改网络接口的状态、IP地址、网关、子网掩码等信息。在本文中&#xff0c;我们将详细介绍ifconfig命令的使用方法和常用选项。 1. 命令语法…

Zookeeper搭建

目录 前言 初了解Zookeeper 搭建 准备 配置Zookeeper 前言 今天来介绍Zookeeper的搭建&#xff0c;其实Zookeeper的搭建很简单&#xff0c;但是为什么还要单独整一节呢&#xff0c;这就不得不先了解Zookeeper有什么功能了&#xff01;而且现在很火的框架也离不开Zookeepe…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的夜间车辆检测系统(深度学习代码+UI界面+训练数据集)

摘要&#xff1a;开发夜间车辆检测系统对于自动驾驶技术具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个夜间车辆检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模型间…

C语言入门学习 --- 6.指针

文章目录 第六章指针1.指针是什么&#xff1f;这里我们总结一下&#xff1a;问题&#xff1a;省流版&#xff1a; 2.指针和指针类型2.1指针-整数2.2指针的解引用 3.野指针3.1野指针成因3.2如何规避野指针 4.指针运算4.1指针-整数4.2指针-指针4.3指针的关系运算标准规定&#xf…

剑指offer面试题34 丑数

考察点 空间换时间提效知识点 题目 分析 这里面其实用到了一点点的数学知识&#xff0c;丑数的定义是只包含2&#xff0c;3&#xff0c;5因子的数。现在要求第1500个丑数&#xff0c;最简单的办法就是从数字1开始遍历&#xff0c;依次判断每个数字是不是丑数&#xff0c;如果…