NzN的数据结构--归并排序及计数排序

           篇接上文,今天要学习的是归并排序以及非比较排序--计数排序。这么励志的日更博主,你怎么能不三连一下呢?

目录

一、归并排序

1. 递归实现

2. 非递归实现

3. 特性总结

二、非比较排序--计数排序

三、排序算法复杂度及稳定性分析


一、归并排序

1. 递归实现

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

 

void _MergrSort(int* a, int begin, int end, int* tmp)
{int mid = (begin + end) / 2;//将数组分为两部分[begin,mid]和[mid+1,end]if (begin >= end){return;}//分治思想:把不有序的数组拆分成一段段小的数组//每一段小的数组进行归并排序_MergrSort(a, begin, mid, tmp);_MergrSort(a, mid + 1, end, tmp);int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;int i = begin;//依次比较,取小的尾插到tmp数组里while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}while (begin1 <= end1){tmp[i++] = a[begin1++];}while (begin2 <= end2){tmp[i++] = a[begin2++];}memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);//申请临时数组if (tmp == NULL){perror("malloc");return;}_MergrSort(a, 0, n - 1, tmp);free(tmp);tmp = NULL;
}

2. 非递归实现

void MergrSortNonR(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);//申请临时数组if (tmp == NULL){perror("malloc");return;}int gap = 1;while (gap < n) {//两组两组归并,因此j每次跳过2个gapfor (int j = 0; j < n; j += 2 * gap){int begin1 = j, end1 = begin1 + gap - 1;int begin2 = end1 + 1, end2 = begin2 + gap - 1;int i = j;//避免存在越界if (end1 >= n || begin2 >= n)break;if (end2 >= n)end2 = n - 1;//依次比较,取小的尾插到tmp数组里while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[i++] = a[begin1++];}else{tmp[i++] = a[begin2++];}}while (begin1 <= end1){tmp[i++] = a[begin1++];}while (begin2 <= end2){tmp[i++] = a[begin2++];}memcpy(a + j, tmp + j, sizeof(int) * (end2 - j + 1));}gap *= 2;}free(tmp);tmp = NULL;
}

3. 特性总结

  • 缺点在于需要 的空间复杂度,思考解决在磁盘中的外排序问题。
  • 时间复杂度:
  • 空间复杂度:
  • 稳定性:稳定

二、非比较排序--计数排序

        常见的非比较排序:计数排序、基数排序、桶排序。其中需要重点掌握计数排序。

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

  • 统计相同元素出现次数
  • 根据统计的结果将序列回收到原来的序列中

void CountSort(int* a, int n)
{//找到最大和最小元素,确定数据范围int min = a[0], max = a[0];for (int i = 1; i < n; i++){if (a[i] > max)max = a[i];if (a[i] < min)min = a[i];}int range = max - min + 1;//创建大小为range的数组,并把整个数组初始化为0int* count = (int*)malloc(sizeof(int) * range);if (count == NULL){perror("malloc");return;}memset(count, 0, sizeof(int) * range);//统计每个数据出现次数//min作为count数组的首元素//通过a[i] - min计算出a[i]在count数组中的下标for (int i = 0; i < n; i++){count[a[i] - min]++;}//min=a[0],i + min=a[i]//遍历count数组,进行排序int j = 0;for (int i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}}
}

特性总结

  • 计数排序适合数据集中的数组排序,效率比较高。
  • 时间复杂度:
  • 空间复杂度:
  • 稳定性:稳定
  • 局限性:只适合整型数据的排序

三、排序算法复杂度及稳定性分析

        以上便是我们比较常用的排序算法,下一篇我们还会额外给大家介绍一种排序算法--外排序。想了解的话,还不速速三连??? 

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

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

相关文章

03-JAVA设计模式-责任链模式

责任链模式 什么是责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;允许你将请求沿着处理者链进行传递。每个处理者均对请求进行某些处理&#xff0c;并可决定是否将请求沿着链传递下去。这种模式给予请求的处理…

Windows版Apache5.7解压直用(免安装-绿色-项目打包直接使用)

windows下Apache分类 Apache分为 安装版和解压版 安装版: 安装方便&#xff0c;下一步------下一步就OK了&#xff0c;但重装系统更换环境又要重新来一遍&#xff0c;会特别麻烦 解压版&#xff08;推荐&#xff09;&#xff1a; 这种方式&#xff08;项目打包特别方便&#…

String类中常见面试题

1.string类属于基本类型吗&#xff1f; string类不是基本类型&#xff1b;它属于引用数据类型 2.操作字符串的类有哪些?有什么区别&#xff1f; 有三种&#xff1a;string,stringBuilder,stringBuffer 区别&#xff1a; String:不可变类&#xff0c;字符串一旦被创建就不能…

给你的AppImage创建桌面快捷方式

原文链接 https://www.cnblogs.com/HGNET/p/16396589.html 运行环境:Ubuntu 22.04 LTS 1.首先准备好AppImage文件并放在一个你知道的地方 2.打开终端&#xff0c;在/usr/share/applications下新建APP.desktop文件&#xff08;APP可以改成你的应用名称&#xff09; cd /usr/s…

【C++算法竞赛 · 图论】图的存储

前言 图的存储 邻接矩阵 方法 复杂度 应用 例题 题解 邻接表 方法 复杂度 应用 前言 上一篇文章中&#xff08;【C算法竞赛 图论】图论基础&#xff09;&#xff0c;介绍了图论相关的概念和一种图的存储的方法&#xff0c;这篇文章将会介绍剩下的两种方法&#xff…

Sonatype Nexus 服务器迁移

因为服务器的升级和调整&#xff0c;有时候会对安装 Sonatype Nexus 的服务器进行迁移到新服务器上。 从技术架构上来说&#xff0c;Sonatype Nexus 我们使用的是 AWS 的存储&#xff0c;所以我们并不需要拷贝大量的数据。 文件夹结构 在备份和恢复之前&#xff0c;我们需要…

【C++】为什么需要CMake?

文章目录 Cmake是什么&#xff1f;Cmake是怎么出现的&#xff1f;C语言为什么会有头文件&#xff1f;C程序的编译流程C程序编译演化史 Cmake是什么&#xff1f; 很多C小白刚进入公司开始接触业务代码的时候&#xff0c;或者在学校实验室接触一些大型的C项目的时候&#xff0c;…

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64)

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64) 一、算法介绍二、算法步骤三、算法实现1.代码 (完整,注释清晰,可直接用)2.结果一、算法介绍 首先说明: ------这里代码手动实现,不调用matlab提供的法向量计算接口,更有助于大家了解法向量和曲率的计算方法,…

H2O-3机器学习平台源码编译的各种坑

H2O-3机器学习平台是一个非常适合非专业人士学习机器学习的平台&#xff0c;自带WebUI&#xff0c;效果还是蛮不错的&#xff0c;官方也提供了jar包&#xff0c;一条命令就能直接运行&#xff0c;非常方便&#xff0c;但最近有源码编译的需求&#xff0c;实际操作过程中&#x…

基于8B/10BGT收发器的PHY层设计(1)

一、PHY层简介 PHY层&#xff08;Physical Layer&#xff09;是OSI模型中最低的一层&#xff0c;也是最基本的一层&#xff0c;PHY是物理接口收发器&#xff0c;它实现物理层。包括MII/GMII&#xff08;介质独立接口&#xff09;子层、PCS&#xff08;物理编码子层&#xff09…

ARM内核的CPU架构模型

1.引言 程序员在编码的时候&#xff0c;如果想有进一步的提升&#xff0c;我认为还是要深入底层理解程序运行原理才好。最近看了一些ARM架构的讲解&#xff0c;总结了如下。虽然是以ARM为原型画的图形&#xff0c;但是对于C和C的编程&#xff0c;还是有一些参考价值的。 2. AR…

Java 基于微信小程序的智能停车场管理小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…