数据结构——归并排序和计数排序的介绍

news2024/10/7 14:33:53

文章目录

  • 归并排序
    • 归并排序的思想
    • 单趟排序的实现
    • 归并排序实现
    • 非递归版本的实现
    • 特性总结
  • 计数排序
    • 计数排序的思想
    • 计数排序的实现
    • 特性总结

归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列。即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
在这里插入图片描述

归并排序的思想

首先,要开辟一个长度和待排序数组一样的临时数组,用于存储归并操作后的数据。一、将带排序的数据区间不断二分,直到区间内只有一个数据或区间不存在。通过递归对每个子区间进行归并,把归并的序列写入到临时数组中,最后将归并好的内容从临时数组拷贝回原数组。
在这里插入图片描述

单趟排序的实现

首先,对两个区间的内容的较小值写入tmp数组中以达到区间归并。当一个区间的数组全部写入完毕,那么将剩下的一个区间的内容直接尾插到临时数组中。最后,用memcpy将临时数组内容拷贝回原数组中。

void _MergeSort(int* arr, int begin, int end, int* tmp)
{
	int mid = (end + begin) / 2;
    //子区间归并
    int begin1 = begin, end1 = mid;
    int begin2 = mid + 1, end2 = end;

    int i = begin;

    while (begin1 <= end1 && begin2 <= end2)
    {
        if (arr[begin1] < arr[begin2])
        {
            tmp[i++] = arr[begin1++];
        }
        else
        {
            tmp[i++] = arr[begin2++];

        }
    }

    //把剩下的直接尾插到tmp数组中
    while (begin1 <= end1)
    {
        tmp[i++] = arr[begin1++];
    }

    while (begin2 <= end2)
    {
        tmp[i++] = arr[begin2++];
    }

    //将归并的内容拷回原数组
    memcpy(arr + begin, tmp + begin, (end - begin + 1) * sizeof(int));
}

归并排序实现

就是在单趟排序的基础上递归对于区间进行划分,直到区间不存在开始进行归并。当然画递归展开图也能有助于我们理解归并排序的递归实现。
在这里插入图片描述

在这里插入图片描述

非递归版本的实现

实现思路如下:将递归改成非递归,其实类似于斐波那契数列的递归改非递归问题。不过这里的归并的思路我们需要从11归并到22归并到44归并。首先,先开辟临时数组。然后,将从1开始进行归并的数据。最后,单趟排序思路如上,这里不做赘述。
在这里插入图片描述
由于数据不可能每次都是完美的二分,所以我们需要对区间进行讨论。begin1肯定是不会越界的。end1,begin2,end2都是存在越界可能的。这里我们已多组拷贝的形式来进行。当end1和begin2越界时,我们直接跳出循环,不做处理。当end2越界时,将end2修正成数组长度-1的下标值。
在这里插入图片描述
下面我就以每组归并完然后拷贝的形式的代码先演示一下。
在这里插入图片描述

下面我将每组区间的值打印出来方便看。
在这里插入图片描述

这是以多组归并后拷贝的方式进行的。当然这不是唯一的方式 ,下面我介绍一下一把梭哈拷贝的方式要怎么处理边界的问题。
在这里插入图片描述
由于是一把梭哈拷贝,所以要对越界区间进行修饰。然后我把修饰后的值打出来看。
在这里插入图片描述

特性总结

一、归并排序的时间复杂度为O(N*LogN),空间复杂度为O(N)。
二、归并排序可以解决在磁盘中的外排序问题。因为有时候在海量的数据下进行排序,内存可能容纳不下,就只能放在磁盘中进行排序。归并排序可以用递归的角度去遍历文件系统。类似的快速排序和堆排序却不能达到这种效果。因为文件系统属于树形结构,对于数组存储的堆和左右指针遍历数组的快速排序都不适合。
三、归并排序是一个稳定的排序。

计数排序

计数排序和前面介绍的有着本质的不同。它属于非比较排序的一种。前面我们介绍的都是比较排序,即值的大小来做比较。

计数排序的思想

根据数组最大值最小值的范围进行相对映射来进行计数,然后遍历技术数组,将相对映射的值重新写回原数组以达到排序的功能。
在这里插入图片描述

计数排序的实现

首先,遍历数组求出最大值和最小值,根据最大值和最小值求出数组值得范围,开辟一个长度为最大值-最小值+1的数组来计数,根据值的相对映射来进行计数,然后遍历技术数组,将相对映射的值重新写回原数组以达到排序的功能。在这里插入图片描述

特性总结

一、计数排序是一个只适用于排序数据范围集中的整型数据。应用场景比较有限。绝对映射是不适合的,因为在有负整数的场景下会无法进行计数。以及在数值较大,数值间差值范围较小的情况下,空间损耗过大。所以采取相对映射比较合适。
二、时间复杂度为O(N+range),空间复杂度为O(range)。

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

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

相关文章

【Java】Map和Set

目录 一、搜索树 1、概念 2、操作-查找 3、操作-插入 4、操作-删除&#xff08;难点&#xff09; 6、性能分析 二、搜索 1、概念及场景 2、模型 三、Map 的使用 1、关于Map的说明 2、关于Map.Entry的说明,> 3、Map 的常用方法说明 4、TreeMap的使用案例 四、…

Django之ORM

一、Django模型层之ORM介绍 使用Django框架开发web应用的过程中&#xff0c;不可避免地会涉及到数据的管理操作&#xff08;增、删、改、查&#xff09;&#xff0c;而一旦谈到数据的管理操作&#xff0c;就需要用到数据库管理软件&#xff0c;例如mysql、oracle、Microsoft S…

护航行业安全!安全狗入选2023年度中国数字安全能力图谱(行业版)

近日&#xff0c;数世咨询正式发布了《2023年度中国数字安全能力图谱&#xff08;行业版&#xff09;》。 作为国内云原生安全领导厂商&#xff0c;安全狗也入选多个细项。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;成立于2013年&#xff0c;…

8大service mesh框架大比拼,Istio不是唯一的选择!

文章目录 一、IsitoConsulLinkerdKumaOpen Service MeshMesheryTraefik MeshService Mesh Interface&#xff08;SMI&#xff09; 公众号&#xff1a; MCNU云原生&#xff0c;文章首发地&#xff0c;欢迎微信搜索关注&#xff0c;更多干货&#xff0c;第一时间掌握&#xff01…

Linux bluez蓝牙开发的准备工作

最近为了搞这个蓝牙的事情&#xff0c;忙碌了好几天&#xff0c;我就是想结合 bluez 的代码随便玩一下蓝牙设备&#xff0c;而且能够参考源码写点测试程序来操作这个蓝牙设备。这里只是说明 Linux 下的准备工作而非嵌入式的arm。 1&#xff0c;系统支持 我用的是真机安装的 D…

路由与交换技术(H3C)①——计算机网络基础

系列文章目录 ①——计算机网络基础 路由与交换技术&#xff08;H3C&#xff09;①——计算机网络概述 系列文章目录一 计算机网络概述1.1 计算机网络1.2 计算机网络的基本功能1.2.1 资源共享1.2.2 分布式处理与负载均衡1.2.3 综合信息服务 二 计算机网络的演进2.1 主机互联时…

Unity Editor扩展 实现一个Excel读表窗口

设计 Unity Editor窗口类 public class ExcelEditorWindow : EditorWindow {[MenuItem( "Frameworks/读表配置界面", false, 10 )]private static void Open(){Rect wr new Rect( 0, 0, 500, 500 );ExcelEditorWindow window ( ExcelEditorWindow ) EditorWindow.…

津津乐道设计模式 - 组合模式详解(以餐厅菜单系统举例让你快速掌握)

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

基于Python所写的玛丽冒险设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87953199 《玛丽冒险》程序使用说明 在PyCharm中运行《玛丽冒险》即可进入如图1所示的游戏主界面。 图1 游戏主界面 具体的操作步骤如下&#xff1a; &#xff08;1&#xff09;游戏…

数据库监控与调优【十四】—— COUNT语句优化

COUNT语句优化 有关COUNT的几个实验与结论 准备工作 create table user_test_count (id int primary key not null auto_increment,name varchar(45),age int,email varchar(60),birthday date ) engine innodb;insert into user_test_count (id, name, a…

算法设计与分析之回溯法

文章目录 1. 回溯法简介1.1 DFS的基本思想1.2 回溯法的基本思想1.3 回溯法和DFS的区别1.4 剪枝 2. 01背包问题&#xff1a;子集树2.1 问题介绍2.2 解决思路2.3 算法实现2.4 如何优化 3. 旅行商问题TSP&#xff1a;排序树3.1 问题介绍3.2 解决思路3.3 算法框架3.4 算法实现 4. 总…

项目一点点记录

kafka发布通知 kafka是消息队列&#xff0c;kafka采用发布订阅模式进行消息的生产与消费。在项目中&#xff0c;我们采用spring来整合kafka&#xff0c; 通过定义事件event来封装 点赞、关注、评论三类事件&#xff0c;event实体中有 事件主题topic&#xff0c;当前用户id&…

怎么给PDF添加图片水印?其实很简单,看这篇就会了!

许多人都意识到版权问题的重要性&#xff0c;尽管在日常生活中我们可能很少遇到&#xff0c;但在办公和学习中却经常涉及到此类问题。例如&#xff0c;我们辛辛苦苦制作的PDF文件&#xff0c;如何确保不被他人盗用呢?这就涉及到如何为PDF添加图片水印的问题&#xff0c;相当于…

无向图G的广度优先搜索和深度优先搜索以及完整程序

图的遍历算法有两种&#xff1a;广度优先搜索和深度优先搜索 一.广度优先搜索类似于层次遍历&#xff0c;需要借助辅助队列 空间复杂度为O(|V|);空间复杂度由辅助队列大小决定 时间复杂度为O(|V||E|) 为避免同一顶点被多次访问&#xff0c;设计visited[]来标记顶点 二.深度…

MyBatis 从初识到掌握

目录 今日良言&#xff1a;与其抱怨于黑暗&#xff0c;不如提灯向前行 一、初识MyBatis 1.MyBatis定义 2.为什么要学习MyBatis 3.MyBatis的创建 二、MyBatis的相关操作 1.增删改查操作 2.动态SQL使用 今日良言&#xff1a;与其抱怨于黑暗&#xff0c;不如提灯向前行 一…

UE4/5 通过Control rig的FullBody【蜘蛛模型,不用basic ik】

目录 根设置 FullBody IK 额外骨设置 ​编辑 晃动效果 根设置 第一步你需要准备一个蜘蛛模型&#xff0c;不论是官方示例或者是epic上购买的模型 然后我用的是epic上面购买的一个眼球蜘蛛&#xff1a; 第一步&#xff0c;我们从根创建一个空项【这个记得脱离父子级到root之…

SQLServer 2016 R2数据库新建、附加、分离、备份、还原、复制等基本操作

一、打开Microsoft SQL Server Management Studio 在桌面上找到图标&#xff0c;双击运行 打开Microsoft SQL Server Management Studio 17 输入服务器名称&#xff0c;选择SQL Server 身份验证&#xff0c;sa和sa密码&#xff0c;可以勾选记住密码&#xff0c;以便以后的登录…

分享基于安卓项目的单元测试总结

前言&#xff1a; 负责公司的单元测试体系的搭建&#xff0c;大约有一两个月的时间了&#xff0c;从最初的框架的调研&#xff0c;到中期全员的培训&#xff0c;以及后期对几十个项目单元测试的引入和推进&#xff0c;也算是对安卓的单元测试有了一些初步的收获以及一些新的认…

【雕爷学编程】Arduino动手做(131)---跑马灯矩阵键盘模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

线性代数基础--矩阵

矩阵 矩阵是由排列在矩形阵列中的数字或其他数学对象组成的表格结构。它由行和列组成&#xff0c;并且在数学和应用领域中广泛使用。 基本概念 元素&#xff1a;矩阵中的每个数字称为元素。元素可以是实数、复数或其他数学对象。 维度&#xff1a;矩阵的维度表示矩阵的行数和…