归并排序与快速排序总结-c++

一,归并排序

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法分治法(Divide and Conquer)的一个非常典型的应用。

作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

1.自上而下的递归(所有递归的方法都可以用迭代重写)
2.自下而上的迭代
1.基本思想

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

在这里插入图片描述
简而言之,先通过递归的思想将数组分成一个一个的不可再分的子序列,接下来再对其中两个子序列按照升序或者降序合并,重复直到合并所有子序列合并完成。(子问题其实就是两个有序数组的合并)。

2.程序实现
#include<iostream>
using namespace std;
#define eleType int

//合并两个有序子序列
/*
参数含义: arr数组, left:序列的左边起始点 mid:中间下标 right:右边结束点
通过left mid right 将arr分成左右两个区域
*/
void merge(eleType *arr,int left,int mid,int right){
    int i = left, j = mid + 1;  // i为左边区域的指针 j 为右边区域的指针
    eleType *temp = new eleType[right + 1]; //临时数组,用来临时存放排序后的数字
    int index = 0; //临时数组的下标
    while(i <= mid && j <= right){ //当左右区域都有未比完的数字
        temp[index++] = arr[i] < arr[j] ? arr[i++] : arr[j++]; //选择较小的存入temp数组
    }
    while(i <= mid){ //当仅剩左边区域
        temp[index++] = arr[i++]; // 按顺序存入temp
    }
    while(j <= right){ //当仅剩右边区域
        temp[index++] = arr[j++]; //按顺序存入temp
    }
    for(int i = 0; i < index; i++){ //将temp重新放回arr
        arr[left + i] = temp[i];
    }
    delete [] temp; //删除临时temp数组
}
//归并排序
/* 
 参数含义: left:最左边下标  right : 最右边的下标
 通过left 和right 计算出中间数的下标
*/
void mergesort(eleType *arr,int left,int right){
    if(left < right){ //递归条件
        int mid = left + (right - left) / 2; //计算中间下标
        mergesort(arr,left,mid); //递归划分左边区域
        mergesort(arr,mid + 1, right);//递归划分右区域
        merge(arr,left,mid,right); //执行合并
    }
}
3.优缺点:

优点
稳定性: 稳定的排序算法,即相同元素的相对顺序在排序前后保持不变。
最佳、平均和最坏时间复杂度:归并排序在所有情况下(包括输入数组已排序或逆序)的时间复杂度都是O(n log n),n是数组的大小。它在处理大数据集时非常高效。
空间复杂度:虽然归并排序需要额外的空间来存储临时子数组,但它的空间复杂度是O(n),在实际应用中通常是可以接受的。
缺点
空间复杂度:虽然O(n)的空间复杂度可以接受的,但对于内存受限的环境或需要就地排序的场合,归并排序不是最佳选择。
数据移动次数:归并排序在合并过程中可能需要大量的数据移动操作,这可能导致在某些情况下效率较低。
不适合小数据集:对于非常小的数据集,归并排序的额外空间开销和递归调用相对于其他简单排序算法效率较低。但是在大数据集上,归并排序的O(n log n)时间复杂度远优于这些简单排序算法。
递归深度:归并排序是递归算法,对于非常大的数据集,递归深度可能会很大,可能导致栈溢出。

二,快速排序

1.基本思想

通过一次排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
在这里插入图片描述

2.实现步骤
  • 1.选择一个基准元素(pivot):通常选择待排序序列的第一个或最后一个元素作为基准。
  • 2.分割过程:将序列中小于基准的元素放在基准的左边,大于基准的元素放在基准的右边。这个过程称为分区(partition)操作,分区结束后基准元素所处的位置就是其在已排序序列中的正确位置。
  • 3.递归排序:分别对基准左右两边的子序列进行快速排序。
3.代码实现
#include<iostream>
using namespace std;
#define eleType int
/* 
	划分 将比基准数大的放右边,比基准数小的放左边
参数含义: arr数组,left:最左边的下标 right: 最右边的下标
*/

int getKeyPositon(eleType *arr,int left,int right){
    int key = arr[left]; //将第一个数作为基准数
    while(left < right){
        while(arr[right] >= key && left < right){ //右边先移动,找比基准数小的
            right--;
        }
        arr[left] = arr[right]; //找到之后赋值给左边left的位置
        while(arr[left] <= key && left < right){ //之后左边移动,找比基准数大的
            left++;
        }
        arr[right] = arr[left];//找到之后赋值给右边right的位置
    }
    arr[left] = key; //左右指针相遇之后,将基准数放回相遇的位置
    return left; //返回基准数的位置
}
/*
排序过程,不停的基准数放到正确位置
参数含义: arr数组,left:最左边的下标 right: 最右边的下标
*/
void quickSort(eleType *arr,int left,int right){
    if(left < right){ //递归条件
        int position = getKeyPositon(arr,left,right); //基准数归位之后,数组被分成左右两部分
        quickSort(arr,left,position - 1); //对左边部分排序
        quickSort(arr,position + 1,right); //对右边部分排序
    }
}
优缺点

优点:
速度快:在平均情况下,快速排序的时间复杂度为O(n log n),比许多排序算法都要快。
原地排序:只需要一个很小的栈空间来保存递归的调用,不需要额外的存储空间。
缺点:
最坏情况:在最坏情况下(输入数据已经有序或接近有序),快速排序的时间复杂度会退化到O(n^2)。
空间复杂度:虽然快速排序是原地排序,但在递归调用时可能会占用较大的栈空间。对于非常大的数据集,会导致栈溢出。
对基准元素的选择敏感:基准元素的选择会影响到排序的性能。如果每次选择的基准元素都是序列中最小或最大的元素,排序的效率就会降低。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么用电脑在线制作活码?快速将活码生成的操作方法

随着现在很多内容都可以通过生成二维码的方式来展示&#xff0c;所以在很多地方都会将内容生成二维码的方式让其他人通过扫码查看内容。二维码不仅能够简化用户获取内容的流程&#xff0c;还可以降低成本&#xff0c;有效提升用户体验&#xff0c;那么不同内容的二维码如何制作…

【SQL Server数据库】数据的增删改操作

目录 一、用SQL语句完成下列功能。 1、新开设一门课程&#xff0c;名叫网络安全与防火墙&#xff0c;学时40&#xff0c;编号为“0118”&#xff0c;主要介绍网络的安全与主要的防火墙软件。 2、先建立monitor表&#xff0c;其结构与student表大致一样&#xff0e;…

c++网络通信

TCP/IP协议 OSI参考模型采用分层划分原则&#xff0c;将网络中的数据传输划分为7层&#xff0c;其中&#xff0c;物理层居于最下层&#xff0c;是最基础、核心的网络硬件层&#xff1b;应用层居于最上层&#xff0c;负责应用资源的管理。每一层使用下层的服务&#xff0c;并向…

js小题3:构造函数介绍与普通函数对比

一、构造函数介绍&#xff1a; 在JavaScript中&#xff0c;构造函数是用于创建和初始化一个由new关键字生成的对象的特殊函数。构造函数的名字通常以大写字母开头&#xff0c;但这并不是JavaScript语法的一部分&#xff0c;而是一种约定俗成的命名规范&#xff0c;有助于区分构…

海南聚广众达电子商务咨询有限公司抖音电商的领航者

在数字经济的浪潮中&#xff0c;电子商务已经成为企业发展的重要引擎。而抖音&#xff0c;这个短视频平台的崛起&#xff0c;更是为电商行业带来了全新的机遇和挑战。海南聚广众达电子商务咨询有限公司&#xff0c;作为抖音电商服务的佼佼者&#xff0c;以其专业的服务、创新的…

Go语言环境安装

Go下载地址 哪个能用用哪个。 https://go.dev/ https://golang.google.cn/&#xff08;Golang官网的官方镜像&#xff09; Windows 使用.msi安装包安装 下载msi文件 安装 双击运行go1.22.4.windows-amd64.msi Next 勾选I accept the terms in the License Agreement&…

查看es p12证书文件过期方法

查看证书过期时间: openssl pkcs12 -in elastic-certificates.p12 -nokeys -out elastic-certificates.crt (需要输入证书生成时配置密码) openssl x509 -enddate -noout -in elastic-certificates.crt

CTF实战:从入门到提升

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是尘缘&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f449;点击这里&#xff0c;就可以查看我的主页啦&#xff01;&#x1f447;&#x…

通付盾入选2024中国数字安全综合实力百强

近日&#xff0c;国内数字化产业第三方调研与咨询机构数世咨询正式发布《新质•中国数字安全百强报告(2024)》&#xff08;以下简称“报告”&#xff09;。通付盾凭借综合实力&#xff0c;从国内800余家经营数字安全业务的企业中脱颖而出&#xff0c;入选综合实力百强“竞争者”…

AI绘画Stable Diffusion人物背景替换实操教程,让创意无限延伸

大家好&#xff0c;我是画画的小强 Stable Diffusion以其强大的能力可以实现人物背景的更换。本文将带你深入了解如何利用Stable Diffusion中的Inpaint Anything插件快速且精准地实现人物背景的替换&#xff0c;从而让你的图片焕发新生。 前期准备 本文会使用到Inpaint Anyt…

230个大模型招投标大单,前三令人意外

大模型市场争夺白热化&#xff0c;前三的座次每个月都在变。 2024年被认为是大模型的应用落地元年&#xff0c;大模型落地的进展一直备受瞩目&#xff0c;而大模型招投标信息被认为是其中的风向标。最近&#xff0c;数智前线通过中国政府采购网、中国招投标公共服务平台、天眼…

思看科技IPO背后:募资金额下调,在创始人配偶管辖下获得补贴?

近日&#xff0c;思看科技&#xff08;杭州&#xff09;股份有限公司&#xff08;下称“思看科技”&#xff09;更新提交2023年最新财务资料&#xff0c;IPO审核进程恢复正常。据贝多财经了解&#xff0c;思看科技于2023年6月递交招股书&#xff0c;同年7月历经第一轮问询。 目…

项目maven标志消失,pom文件显示为橙色/橘色标志

背景&#xff1a; 公司开发新的项目&#xff0c;我要拉一下item服务的工程进行开发&#xff0c;等我把代码拉下来发现我idea右侧边栏的maven没了&#xff0c;pox.xml文件也变成了这种橙色/橘色的标志。 分析&#xff1a; 这个是一个不正常的maven项目pom&#xff0c;可能是由于…

Node.js实现短链接(ShortLink):shortid、epxress让URL更简单

文章目录 一、短链接介绍二、插件介绍1、epxress2、shortid 三、实现方案1、安装依赖&#xff1a;2、实现原理 四、示例代码五、测试生产短链接 一、短链接介绍 短链接是指仅包含一个网址的链接形式&#xff0c;通俗一些就是将一个很长很复杂的的网址变成一个简短易记的链接。…

【大数据技术原理与应用(概念、存储、处理、分析与应用)】第1章-大数据概述习题与知识点回顾

文章目录 单选题多选题知识点回顾几次信息化浪潮主要解决什么问题&#xff1f;信息科技为大数据时代提供哪些技术支撑&#xff1f;数据产生方式有哪些变革&#xff1f;大数据的发展历程大数据的四个特点&#xff08;4V&#xff09;大数据对思维方式的影响大数据有哪些关键技术&…

Android10 Settings系列(六)Settings中toolbar 的基本流程,和Activity如何关联,这可能是比较详细的分析

一、前言 写在前面:一个快捷栏,音量浮窗快捷进入设置界面,点击左上角返回键拉起设置首页问题引发的思考和解决方法 事情的起因是测试报了一个问题。在Android9的一个设备在点击音量键时,在弹出的弹框中,点击设置图标快速进入音量设置中,点击左上角返回按钮是,退出当前界…

GPT-5智能新纪元的曙光

在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&#xff0c;给出了肯定答案并表示将在一年半后发布。穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述为高中生到博士生的成长。 这一爆炸性的消息&#xff0c;震动了整体…

期货交易中的几种常见心态管理

期货交易通常涉及到风险和收益的权衡&#xff0c;因此参与者的心态可以显著影响他们的决策和最终结果。以下是一些炒期货的常见心态&#xff1a; 1. 利润最大化心态&#xff1a;持有这种心态的投资者不关心风险&#xff0c;只考虑高利润。他们可能会盲目追求高回报&#xff0…

第26课 绘制原理图——原理图布局的调整

概述 我们可以根据需要&#xff0c;对原理图上各个图元的位置进行调整&#xff0c;让整个电路图的布局更加舒服。 拖动图元 只需按住鼠标左键&#xff0c;即可拖拽图元。 旋转图元 在原理图上时选中一个图元&#xff0c;之后按一次空格键&#xff0c;即可将图元逆时针旋转90…

怎么把avi转换成mp4?超好用的四种转换方法介绍!

怎么把avi转换成mp4&#xff1f;AVI&#xff0c;这个曾经风光一时的视频格式&#xff0c;如今却像是时代的遗珠&#xff0c;被现代科技潮流逐渐边缘化&#xff0c;在数字化飞速发展的今天&#xff0c;AVI面临着严重的兼容性问题&#xff0c;由于它诞生于一个较早的时代&#xf…