c++ 归并排序

2023-09-20 14:28:19

归并排序算法时间复杂度较为稳定,一般为nlogn,而快速排序受源数组排序影响较大,今天来学习归并排序。

一.归并排序代码

首先上代码:可以直接运行

#include<bits/stdc++.h>
using namespace std;

void insertsort(vector<int>&nums, int left,int mid, int right)
{
	if (nums[mid] <= nums[mid + 1])
		return;
	for (int i = left+1; i <= right; ++i)
	{
		int idx = i;
		while (idx > left && nums[idx] < nums[idx - 1])
		{
			swap(nums[idx], nums[idx-1]);
			--idx;
		}			
	}
}

vector<int>temp;
void merge(vector<int>&nums,int left,int mid,int right)
{
	if (nums[mid] <= nums[mid + 1])
		return;

	for (int i = left; i <= right; ++i)
		temp[i] = nums[i];
	int x = left, y = mid + 1;
	for (int i = left; i <= right; ++i)
	{
		if (y > right|| (y<=right&&x<=mid&&temp[x] <= temp[y]))
		{
			nums[i] = temp[x];
			++x;
		}			
		else if (x>mid||(x<=mid&&temp[x]>temp[y]))//条件可省略
		{
			nums[i] = temp[y];
			++y;
		}			
	}
}


void mergesort(vector<int>&nums,int left,int right)
{
	if (left >=right) return;
	int mid = left + (right - left)/2;
	mergesort(nums, left, mid);
	mergesort(nums, mid + 1, right);
	if (mid - left + 1 <= 10)
		insertsort(nums, left, mid, right);
	else
		merge(nums, left, mid, right);
}


int main()
{
	vector<int>nums = { 2,1,4,6,5,88,99,0,999};
	int n = nums.size();
	temp.resize(n);
	mergesort(nums,0,n-1);
	for (auto &num : nums)
		cout << num << endl;
	return 0;
}

二.代码详解

1.主函数

主函数较为简单,就是定义数组,然后调用mergesort函数,最后打印输出。

值得注意的是在主函数中我们将一个temp数组定义了大小,这个数组是辅助数组,在详细的有序合并的操作中用得到,因为我们需要好多次的合并,每次合并后的数组都不一样。

2.mergesort函数

这个函数就是一个递归函数,不断地去分割,直到分割到最后只有一个元素时,它会退出分割操作,然后这个元素会和分割出的另一半元素进行合并操作,合并完成跳到上一级继续合并。

3.merge合并函数

在合并函数中,首先如果左右两个已经是有序的,则不需要合并,直接返回。

然后我们将要合并的left到right之间的元素拷贝到temp辅助数组中,

因为原来左右两边就是有序的,所以我们只关注左右两边的起始索引,将较小的那个放进nums[i]中,

特别要注意的是元素过界问题,因为只是归并操作,索引并不会突破数组上限,从而造成结果不正确而很难发现出问题。

如果说y右侧索引超出了限定right,我们将temp[x]赋值给nums[i],此时x不会出上限。

或者说y没出索引,x也没出索引,那么当temp[x]<temp[y]时,我们也将temp[x]赋值给nums[i].

其余情况均是temp[y]赋值给nums[i]。

4.插入排序insertsort 

当right-left特别小的时候,我们可以直接使用插入排序,想象一下我们只有两个元素[2,1],

插入排序只需要swap两个值即可,而不需要赋值给赋值数组。

插入排序的思想是前面的数组元素是有序的,那么我遍历到第idx个元素时,我要把它插入到前面的合适位置,特别地如果这个值比较大,那么它不用动,

如果它比较小,那么让他和idx-1的数进行不断交换,直到遇到合适的位置。 

更多推荐

5.10.WebRTC接口宏

那今天呢?我给大家介绍一下webrtc的接口宏,那之所以在现成的章节中要介绍接口宏。是由于接口在调用的过程中啊,会发生线程的切换,所以把接口宏这部分知识我们放在线程这一章还算比较合适的。那另外呢,我们对于接口宏的介绍可能要花费三节到四节的时间,那之所以要用这么大的篇幅来介绍接口宏,是由于接口宏本身是比较复杂的。里边儿涉

python学习--函数

函数的创建与调用什么是函数函数就是执行特定任务或完成特定功能的一段代码为什么需要函数复用代码隐藏实现细节提高可维护性提高可读性便于调试函数的创建def函数名([输入函数]):函数体[returnxxx]defcalc(a,b):#a,b称为形式参数,简称形参,形参的位置是在函数定义处c=a+breturncresult

【Redis GEO】1、地理位置类型的基本用法

1、RedisGEO介绍RedisGEO主要用于存储地理位置信息,并对存储的信息进行操作,该功能在Redis3.2版本新增。RedisGEO操作方法有:geoadd:添加地理位置的坐标。geopos:获取地理位置的坐标。geodist:计算两个位置之间的距离。georadius:根据用户给定的经纬度坐标来获取指定范围内

jQuery 指定区域的内容循环滚动

需求:页面指定区域内的内容循环滚动,但是内容形式、高度都不固定,是接口从编辑器提取出来的内容。代码:<divid="container5"><divclass="content"id="f12red1">自2023年9月20日24时起,国内汽、<br>柴油价格(标准品,下同)每吨分别提高70元。<br>自2023年9月

python 二手车数据分析以及价格预测

二手车交易信息爬取、数据分析以及交易价格预测引言一、数据爬取1.1解析数据1.2编写代码爬1.2.1获取详细信息1.2.2数据处理二、数据分析2.1统计分析2.2可视化分析三、价格预测3.1价格趋势分析(特征分析)3.2价格预测引言本文着眼于车辆信息,结合当下较为火热的二手车交易市场数据,对最近二手车的交易价格进行分析

服务器租用机房机房的类型应该如何选择

服务器租用机房机房的类型应该如何选择1.单电信机房单电信服务器机房业务模式比较固定,访问量也不是很大,适合新闻类网站或政务类网站。如果网站的PV流量持续增加,建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题。2.双线机房双线机房在单线机房上有所升级,主要是因为机房接入了两个运营商带宽线路。因为国内两大网

nodejs、web3js开发以太坊

nodejs、web3js开发以太坊目录nodejs、web3js开发以太坊环境依赖详解安装并运行ganache创建一个web服务器实例创建web3erver.js文件路由模块路由函数处理模块测试完整代码本案例主要利用nodejs和web3搭建一个供前端直接调用的接口,主要包含以下功能获取地址余额获取一个新的钱包转账获

Python终端优化:提高工作效率的关键步骤

💂个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】导言:Python是一种强大的编程语言,广泛用于数据分析、Web开发、自动化脚本等各种领域。对于许多开发人员和数据科学家来说,Python

MyBatis 反射模块

文章目录前言反射模块实现ReflectorReflectorFactoryInvokerMetaClassMetaObject反射模块应用SqlSessionFactory执行SQL前言MyBatis在进行参数处理、结果集映射等操作时会使用到大量的反射操作,Java中的反射功能虽然强大,但是代码编写起来比较复杂且容易出

pywinauto:Windows桌面应用自动化测试(三)

前言上一篇文章地址:pywinauto:Windows桌面应用自动化测试(二)_LionKing的博客-CSDN博客下一篇文章地址:暂无一、win应用的后端技术1、官方文档安装了pywinauto后,如何开始使用呢?首先必须确定哪种辅助技术(pywinauto的后端)可以用于你的应用程序,注意粗体部分。在Windows

【LittleXi】第四章 Process Intro exercise

目录【LittleXi】第四章ProcessIntroexercise第四章实验准备问题【LittleXi】第四章ProcessIntroexercise第四章实验准备下载实验所需代码wgethttp://pages.cs.wisc.edu/~remzi/OSTEP/Homework/HW-CPU-Intro.tgz解

热文推荐