排序(归并排序,非比较排序)

news2024/9/21 4:22:02

归并排序

归并排序(MERGE-SORT)是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法(Divide and Conquer)的⼀个⾮常典型的应⽤。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成⼀个有序表,称为⼆路归并。

算法分析

分解:利用mid=(left+right)/2求出中间值,利用左侧[left,mid],右侧[mid+1,right]的划分,分解的结束条件是数组的长度为1时。

递归合并:数组递归的结束条件时当left>=right,类似与二叉树的尾插,然后对左右两侧的数组进行比大小后合并,依次上返回。

 算法特性

‧ 时间复杂度为 O(n log n):划分产生高度为 log n 的递归树,每层合并的总操作数量 为 n ,因此总体时间复杂度为 O(n log n) 。

‧ 空间复杂度为 O(n):递归深度为 log n,使用 O(log n) 大小的栈帧空间。合并操作需 要借助辅助数组实现,使用 O(n) 大小的额外空间。

‧ 稳定排序:在合并过程中,相等元素的次序保持不变。   

源代码

//归并排序
void _MergeSort(int* arr, int left, int right, int* tem)
{
	//递归
	if (left >= right)
	{
		return;
	}
	int mid = (left + right) / 2;
	_MergeSort(arr, left, mid, tem);
	_MergeSort(arr, mid + 1, right, tem);
	//合并
	int bagan1 = left, bagan2 = mid + 1;
	int end1 = mid, end2 = right;
	int index = bagan1;
	while (bagan1 <= end1 && bagan2 <= end2)
	{
		if (arr[bagan1] < arr[bagan2])
		{
			tem[index++] = arr[bagan1++];
		}
		else
		{
			tem[index++] = arr[bagan2++];
		}
	}
	//越界情况
	//2越界的情况
	while (bagan1<=end1)
	{
		tem[index++] = arr[bagan1++];
	}
	//1越界的情况
	while (bagan2 <= end2)
	{
		tem[index++] = arr[bagan2++];
	}
	for (int i = left; i <=right; i++)
	{
		arr[i] = tem[i];
	}
}
void MergeSort(int* arr, int n)
{
	//开辟空间
	int* tem = (int*)malloc(sizeof(int) * n);
	_MergeSort(arr, 0, n-1,  tem);
	free(tem);
}

计数排序

算法分析

计数排序⼜称为鸽巢原理,是对哈希直接定址法的变形应⽤。操作步骤:

 1)统计相同元素出现次数

 2)根据统计的结果将序列回收到原来的序列中

如何解决空间浪费的情况:

因为,我记数排序要先开辟空间,把值放进去,但是当最大值较大,数据所在的区间又较为密集的时候,就会出现上述状况,造成空间的浪费。因此我们利用max-min算出所要开辟的空间的范围,从而避免空间的浪费。

如何进行存储负数:

我们知道负数在数组中是无法表示的,这时我们可能会想到,取绝对值,但是如果出现一个负数的绝对值后的值正好和原数组中某一个数一样是不是就会出现错误。解决方案:让最小的负数减去本身即可。

时间复杂度,空间复杂度

 空间复杂度:O(range)

时间复杂度:O(N +range),但是有同学会想难度不是时间复杂度:O(N*range)?

这里面内层循环就是n个数据循环n次,外层是一次遍历所以这里的时间复杂度是n+range,而不是range*n;

计数排序的特性

  1. 计数排序在数据范围集中时,效率很⾼,但是适⽤范围及场景有限。
  2. 只使用整数不适应小数。
  3. 稳定性高

源代码

//计数排序
void CountSort(int* arr, int n)
{
	//先确定范围
	int min = arr[0], max = arr[0];
	for (int i = 1; i < n; i++)
	{
		if (arr[i] < min)
		{
			min = arr[i];
		}
		if (arr[i] > max)
		{
			max = arr[i];
		}
	}
	int range = max - min + 1;
	//开辟空间
	int* tem = (int*)malloc(sizeof(int) * range);
	if (tem == NULL)
	{
		perror("malloc fail!!!");
		exit(1);
	}
	//初始化,利用memset函数
	memset(tem, 0, sizeof(int) * range);
	//
	for (int i = 0; i < n; i++)
	{
		tem[arr[i] - min]++;
	}
	int index = 0;
	for (int i = 0; i < range; i++)
	{
		//解决数据的重复出现,只要不为零就会输出,直到变为零位置
		while (tem[i]--)
		{
			arr[index++] = i + min;
		}
	}
}

总结

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的 相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,⽽在排序后的序列中,r[i]仍在r[j]之 前,则称这种排序算法是稳定的;否则称为不稳定的。

数据结构结构初阶的排序基本上总结完毕了,这里我学了冒泡,插入,选择,快排,希尔,堆,归并,计数排序,这几种排序在时间复杂度,空间复杂度以及稳定性上各有各的优点。下面我们用一张图进行总结。

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

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

相关文章

《深入浅出WPF》读书笔记.6binding系统(中)

《深入浅出WPF》读书笔记.6binding系统(中) 背景 这章主要讲各种模式的数据源和目标的绑定。 代码 把控件作为Binding源与Binding标记扩展 方便UI元素之间进行关联互动 <Window x:Class"BindingSysDemo.BindingEle"xmlns"http://schemas.microsoft.com…

IP打开“向下”空间,爱奇艺“摊牌了”

长视频领域上半年竞争激烈、好剧频出&#xff0c;让行业焕发了新的吸引力&#xff0c;优质内容对行业的正向引导作用持续凸显。正如爱奇艺创始人、CEO龚宇最新的发言&#xff1a;“长视频行业实现长期发展的关键在于优质内容供给的持续性&#xff0c;以及内容质量和商业收益的双…

页面设计任务 商品详情页

目录 成品: 任务描述 源码&#xff1a; 详细讲解&#xff1a; 1.导航栏讲解 2.主体部分 3.图像部分 4.评分部分 5.按钮部分 6.配置信息部分 7.响应式设计 成品: 任务描述 创建一个产品展示页面&#xff0c;包括以下内容&#xff1a; 网页结构&#xff1a;使用 HTM…

选择适合的电脑监控软件,可以提升员工效率

在信息化时代&#xff0c;企业对员工的管理不再仅限于传统的考勤制度和绩效评估。随着工作方式的多样化&#xff0c;特别是远程办公的普及&#xff0c;电脑监控软件成为企业管理的重要工具。这些软件不仅能帮助管理者了解员工的工作状态&#xff0c;还能有效提升工作效率&#…

唯有自救,才能得救

回顾这一周的五天&#xff0c;也做成了一些事&#xff0c;想做的事&#xff0c;立即行动&#xff0c;几乎是心到手到&#xff0c;最后也出了一些成绩。 全红婵跳完水&#xff0c;得了个满分&#xff0c;一边走路&#xff0c;一边擦头发&#xff0c;旁边的记者问&#xff1a;你…

数字孪生网络 (DTN)关键技术分析

数字孪生网络 (DTN): 概念、架构及关键技术 摘要 随着5G商用规模部署和下一代互联网IPv6的深化应用&#xff0c;新一代网络技术的发展引发了产业界的广泛关注。智能化被认为是新一代网络发展的趋势&#xff0c;为数字化社会的信息传输提供了基础。面向数字化、智能化的新一代网…

Leetcode面试经典150题-42.接雨水

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {/**本题的解题思路是双指针&#xff1a;一个从头开始一个从尾巴开始&#xff0c;两头的肯定是没有办法接住雨水的,你可以认为0位置左边是0的柱子所以理论上我们是从1遍历到n-2&#xff0c;但是你也可以遍历0到N…

SpringData基础学习

一、SpringData 概述 二、SpringData JPA HelloWorld 三、Repository 接口

快速入门:使用Python构建学生成绩管理应用

前言 诸位观众&#xff0c;本学期我有幸学习了Python编程课程。随着课程的结束&#xff0c;授课教师布置了一项任务&#xff0c;要求我们开发一个学生信息管理系统。基于老师的要求&#xff0c;我个人独立完成了这项任务。今天&#xff0c;我希望将这个简易的程序分享给大家&a…

《黑神话·悟空》是用什么编程语言开发的?

最近国内出了一款3A大作的游戏&#xff0c;凭借牛b的画面、文化底蕴、剧情&#xff0c;已经吸引了很多人入局&#xff0c;当然小孟也在第一时间尝鲜。 最直接的感受&#xff1a;效果牛b&#xff0c;画面牛b&#xff0c;游戏好玩。但是时间太忙&#xff0c;准备过年的放假的时候…

PMP–知识卡片--鱼骨图

鱼骨图由日本质量管理大师石川馨发明&#xff0c;也称因果图&#xff0c;原本用于质量管理。现在多用于问题整理。 在使用该工具时&#xff0c;把问题写在鱼骨的头上&#xff0c;然后召集同事&#xff0c;尽可能多的找出问题&#xff0c;大骨写大问题&#xff0c;中小骨写中小…

Web前端性能优化合集

简介 自互联网兴起以来&#xff0c;从最初的静态网页到如今的动态交互、单页应用&#xff08;SPA&#xff09;、PWA&#xff08;Progressive Web Apps&#xff09;等&#xff0c;互联网技术正在飞速发展&#xff0c;随着用户体验成为核心竞争力之一&#xff0c;前端性能直接影…

哪种电容笔更好用一点?2024开学季实测五款高性价比电容笔!

近年来&#xff0c;随着无纸化学习的日益普及&#xff0c;电容笔的重要性越来越凸显&#xff0c;但面对市场上数不清的电容笔种类和品牌&#xff0c;我们到底该选择哪种电容笔更好用一点呢&#xff1f;趁着即将开学&#xff0c;好多小伙伴都在寻找学习用品和数码好物之际&#…

Python Selenium实现自动化测试及Chrome驱动使用!

本文将介绍如何使用Python Selenium库实现自动化测试&#xff0c;并详细记录了Chrome驱动的使用方法。 通过本文的指导&#xff0c;读者将能够快速上手使用Python Selenium进行自动化测试。 并了解如何配置和使用Chrome驱动来实现更高效的自动化测试。 一、Python Selenium简…

2024年甘肃省安全员C证证考试题库及甘肃省安全员C证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年甘肃省安全员C证证考试题库及甘肃省安全员C证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

运动耳机哪个牌子好?五大高品质巅峰机型汇总!

​对于运动时享受音乐的朋友来说&#xff0c;耳机的舒适度至关重要&#xff0c;它直接影响到我们能否在运动中发挥最佳状态。无论是高端旗舰耳机还是性价比较高的入门级产品&#xff0c;长时间佩戴的不适感都可能干扰我们的运动节奏。因此&#xff0c;开放式耳机因其不入耳的设…

数据资产价值评价:开启数据要素市场的关键钥匙

数据资产价值评价&#xff1a;开启数据要素市场的关键钥匙 前言数据资产价值评价 前言 数据资产作为当今数字化时代的重要生产要素&#xff0c;其价值评价至关重要。数据资产的价值在于与应用场景的紧密结合&#xff0c;不同场景下数据所贡献的经济价值存在显著差异。例如&…

WIFI 模组8286驱动

原理图&#xff1a; 注&#xff1a;使用的数串口1的引脚&#xff0c;PA1是发送端引脚&#xff0c;PA3是接收端引脚&#xff0c;PA7串口的使能位。 1.0 WIFI模组驱动 驱动初始化函数&#xff1a; void WifiModuleDrvInit(void) {WifiGpioInit();WifiUartInit(115200);WifiDmaIn…

window系统如何适用redis

目录 1、解压缩安装包 2、命令行启动服务 3、客户端连接 4、redis客户端工具 1、解压缩安装包 2、命令行启动服务 3、客户端连接 4、redis客户端工具

CSS3多行多栏布局

当前布局由6个等宽行组成&#xff0c;其中第四行有三栏&#xff0c;第五行有四栏。 重点第四行设置&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>img {hei…