【数据结构与算法】第12课—数据结构之归并排序

文章目录

  • 1. 归并排序
  • 2. 计数排序
  • 3. 排序算法复杂度及稳定性分析
    • 在这里插入图片描述

1. 归并排序

  • 分治法(Divide and Conquer)是一种重要的算法设计策略,其核心思想是将一个复杂的大问题分解为若干个小规模的子问题,递归地解决这些子问题,并将它们的解合并起来以得到原始问题的解。
  • 而归并排序正是分治法的一个典型应用
  • 归并排序的思想:首先将一个序列分为两个子序列,再将两个子序列分为4个子序列,直到每个元素都各为一个序列,则不再继续分,然后合并子序列,将子序列开始有序合并,最终合并成一个有序的序列,它本质还是递归
  • 接下来我将用图示的方法来帮助大家理解

在这里插入图片描述


在这里插入图片描述


  • 代码
//归并排序子函数
void _MergeSort(int* arr, int left, int right, int* tmp)
{//如果首元素下标大于等于尾元素下标if (left >= right){return;}//根据中间值二分int mid = left + (right - left) / 2;//左边序列[left,mid]  右边序列[mid+1,right]_MergeSort(arr, left, mid, tmp);//分解左子序列_MergeSort(arr, mid + 1, right, tmp);//分解右子序列//合并两个有序序列int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int index = begin1;while (begin1 <= end1 && begin2 <= end2){//如果第一个序列的首元素小于第二个序列的首元素if (arr[begin1] < arr[begin2]){tmp[index++] = arr[begin1++];//赋完值都往后走}//如果第一个序列的首元素大于第二个序列的首元素else{tmp[index++] = arr[begin2++];//赋完值都往后走}}//此时若第一个序列还有元素未放入tmp,直接全部放入tmpwhile (begin1 <= end1){tmp[index++] = arr[begin1++];}//此时若第二个序列还有元素未放入tmp,直接全部放入tmpwhile (begin2 <= end2){tmp[index++] = arr[begin2++];}//最后将新建的数组tmp赋给arrfor (int i = left; i <= right; i++){arr[i] = tmp[i];}
}//归并排序
void MergeSort(int* arr, int sz)
{//创建tmp函数用来接收合并的有序数组int* tmp = (int*)malloc(sizeof(int) * sz);if (tmp == NULL){perror("malloc fail!\n");exit(1);}_MergeSort(arr, 0, sz - 1, tmp);free(tmp);tmp = NULL;
}

2. 计数排序

  • 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤:
  • 1)统计相同元素出现次数
    2)根据统计的结果将序列回收到原来的序列中

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


  • 代码
//计数排序
void CountSort(int* arr, int sz)
{int max = arr[0], min = arr[0];//默认为首元素//找最大、最小数for (int i = 0; i < sz; i++){if (arr[i] > max){max = arr[i];}if (arr[i] < min){min = arr[i];}}//计数int range = max - min + 1;//count数组大小//calloc申请内存会自动将所有元素默认设置为0int* count = (int*)calloc(range, sizeof(int));if (count == NULL){perror("malloc fail!\n");exit(1);}for (int i = 0; i < sz; i++){count[arr[i]-min]++;//对应的count数组元素++}//排序int index = 0;//arr数组下标//遍历count数组,找对应元素出现的次数for (int i = 0; i < range; i++){//将count数组对应元素放入arr数组while (count[i]--){arr[index++] = i + min;}}//释放内存free(count);count = NULL;
}
  • 计数排序的时间复杂度是O(n+range)
  • 计数排序的空间复杂度是O(range)
  • 计数排序有一定的局限性,当数组中的数据差值较大时,会造成空间的极大浪费,此时计数排序便不再适用,因此它只适用于元素之间差值较小的序列

3. 排序算法复杂度及稳定性分析

  • 稳定性:对于含有相同数据的序列,排序前后不改变他们的相对位置,则代表该算法稳定,否则表示该排序算法不稳定

在这里插入图片描述


  • 各种排序算法的时间复杂度

在这里插入图片描述

  • 各种排序性能测试

在这里插入图片描述


//测试排序的性能对⽐
void TestOP()
{srand(time(0));const int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);int* a3 = (int*)malloc(sizeof(int) * N);int* a4 = (int*)malloc(sizeof(int) * N);int* a5 = (int*)malloc(sizeof(int) * N);int* a6 = (int*)malloc(sizeof(int) * N);int* a7 = (int*)malloc(sizeof(int) * N);for (int i = 0; i < N; ++i){a1[i] = rand();a2[i] = a1[i];a3[i] = a1[i];a4[i] = a1[i];a5[i] = a1[i];a6[i] = a1[i];a7[i] = a1[i];}int begin1 = clock();InsertSort(a1, N);int end1 = clock();int begin2 = clock();ShellSort(a2, N);int end2 = clock();int begin3 = clock();SelectSort(a3, N);int end3 = clock();int begin4 = clock();HeapSort(a4, N);int end4 = clock();int begin5 = clock();QuickSort(a5, 0, N - 1);int end5 = clock();int begin6 = clock();MergeSort(a6, N);int end6 = clock();int begin7 = clock();BubbleSort(a7, N);int end7 = clock();printf("InsertSort:%d\n", end1 - begin1);printf("ShellSort:%d\n", end2 - begin2);printf("SelectSort:%d\n", end3 - begin3);printf("HeapSort:%d\n", end4 - begin4);printf("QuickSort:%d\n", end5 - begin5);printf("MergeSort:%d\n", end6 - begin6);printf("BubbleSort:%d\n", end7 - begin7);free(a1);free(a2);free(a3);free(a4);free(a5);free(a6);free(a7);
}

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

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

相关文章

2024 年 Apifox 和 Postman 对比介绍详细版

Apifox VS Postman &#xff0c;当下流行的的两款 API 开发工具&#xff0c;2024 版对比&#xff01;

vue请求数据报错,设置支持跨域请求,以及2种请求方法axios或者async与await

设置跨域 通过vite创建的项目&#xff0c;一般会在你项目文件中自动生成一个名为vite.config文件&#xff0c;点击添加支持跨域的代码 import { defineConfig } from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({plu…

【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)

& 第四届信号处理与通信技术国际学术会议&#xff08;SPCT 2024&#xff09; 2024 4th International Conference on Signal Processing and Communication Technology 2024年12月27-29日 中国深圳 www.icspct.com 第四届信号处理与通信技术国际学术会议&#x…

【大数据学习 | HBASE高级】rowkey的设计,hbase的预分区和压缩

1. rowkey的设计 ​ RowKey可以是任意字符串&#xff0c;最大长度64KB&#xff0c;实际应用中一般为10~100bytes&#xff0c;字典顺序排序&#xff0c;rowkey的设计至关重要&#xff0c;会影响region分布&#xff0c;如果rowkey设计不合理还会出现region写热点等一系列问题。 …

基于微信小程序的农场管理系统的设计与实现,LW+源码+讲解

1.2 课题意义 现如今&#xff0c;信息种类变得越来越多&#xff0c;信息的容量也变得越来越大&#xff0c;这就是信息时代的标志。近些年&#xff0c;计算机科学发展得也越来越快&#xff0c;而且软件开发技术也越来越成熟&#xff0c;因此&#xff0c;在生活中的各个领域&…

学习记录:js算法(九十二):克隆图

文章目录 克隆图思路一 克隆图 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 图中的每个节点都包含它的值 val&#xff08;int&#xff09; 和其邻居的列表&#xff08;list[Node]&#xff09;。 class Node {public int…

大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

win11 新建一个批处理,双击查看本机的IP地址

1、先上个图&#xff1a; 2、bat的代码&#xff1a; :: 获取本机 IP 地址 &#xff1a; 只显示ip echo off for /f "tokens2 delims:" %%a in (ipconfig ^| findstr /i "IP 地址") do set IP%%a echo %IP%pause 3、新建一个文件比如叫ip.bat&#xff0c;…

Spring高手之路26——全方位掌握事务监听器

文章目录 1. 什么是Spring事务监听器&#xff1f;2. 通过TransactionSynchronization 接口实现事务监听器3. 时序图&#xff1a;通过TransactionSynchronization 接口实现事务监听器4. TransactionalEventListener注解实现事务监听器5. 时序图&#xff1a;TransactionalEventLi…

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过&#xff0c;上架后却一直无法被搜索到。打开后&#xff0c;再在 QQ 上下拉查看 “最近使用”&#xff0c;发现他出现一下又马上消失。 上线是按正常流程走的&#xff0c;开发、备案、审核&#xff0c;没有任何违规&#xf…

MFC工控项目实例二十九主对话框调用子对话框设定参数值

在主对话框调用子对话框设定参数值&#xff0c;使用theApp变量实现。 子对话框各参数变量 CString m_strTypeName; CString m_strBrand; CString m_strRemark; double m_edit_min; double m_edit_max; double m_edit_time2; double …

C语言 | Leetcode C语言题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; int nextGreaterElement(int n){int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 % 10 < targetDigit; x2…

elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明

前言 在使用el-table 表格中有些表格的表头需要加入一些提示&#xff0c;鼠标移入则出现提示&#xff0c;非常实用&#xff0c;我是通过el-table中的el-tooltip实现的&#xff0c;以下的效果预览 代码实现 <el-table ref"multipleTable" :data"data"…

阿里云通义大模型团队开源Qwen2.5-Coder:AI编程新纪元

&#x1f680; 11月12日&#xff0c;阿里云通义大模型团队宣布开源通义千问代码模型全系列&#xff0c;共6款Qwen2.5-Coder模型。这些模型在同等尺寸下均取得了业界最佳效果&#xff0c;其中32B尺寸的旗舰代码模型在十余项基准评测中均取得开源最佳成绩&#xff0c;成为全球最强…

python 同时控制多部手机

在这个智能时代,我们的手机早已成为生活和工作中不可或缺的工具。无论是管理多个社交媒体账号,还是处理多台设备上的事务,如何更高效地控制多个手机成为了每个人的痛点。 今天带来的这个的软件为你提供了一键控制多部手机的强大功能。无论是办公、娱乐,还是社交,你都能通过…

软件测试:测试用例详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、通用测试用例八要素   1、用例编号&#xff1b;    2、测试项目&#xff1b;   3、测试标题&#xff1b; 4、重要级别&#xff1b;    5、预置…

【操作系统】守护进程

一、守护进程的概念 守护进程是一个在后台运行并且不受任何终端控制的进程 二、自己实现守护进程 1.预备知识 &#xff08;1&#xff09;/dev/null /dev/null是一个特殊的设备文件&#xff0c;往这个文件里写不进去任何数据&#xff0c;也读不出来任何数据 因此&#xff0…

基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

数字后端教程之Innovus report_property和get_property使用方法及应用案例

数字IC后端实现Innovus中使用report_property可以报告出各种各样object的属性&#xff0c;主要有cell&#xff0c;net&#xff0c;PG Net&#xff0c;Pin&#xff0c;时钟clock&#xff0c;时序库lib属性&#xff0c;Design属性&#xff0c;timing path&#xff0c;timin arc等…

Llama架构及代码详解

Llama的框架图如图&#xff1a; 源码中含有大量分布式训练相关的代码&#xff0c;读起来比较晦涩难懂&#xff0c;所以我们对llama自顶向下进行了解析及复现&#xff0c;我们对其划分成三层&#xff0c;分别是顶层、中层、和底层&#xff0c;如下&#xff1a; Llama的整体组成…