当前位置: 首页 > news >正文

归并排序、计数排序及排序大总结

一、归并排序

1.基本思想

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

2.动图演示

3.代码展示

void _MergeSort(int* a, int* tmp, int begin, int end)
{if (begin >= end)return;int mid = (begin + end) / 2;// 如果[begin, mid][mid+1, end]有序就可以进行归并了,//若写成[begin, mid - 1][mid, end]存在栈溢出的问题_MergeSort(a, tmp, begin, mid);_MergeSort(a, tmp, mid + 1, end);// 归并int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;int i = begin;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, (end - begin + 1) * sizeof(int));
}
void MergeSort(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}_MergeSort(a, tmp, 0, n - 1);free(tmp);tmp = NULL;
}

4.归并排序特性总结

①归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。

②时间复杂度:O(N*logN)。

③空间复杂度:O(N)。

④稳定性:稳定。

5.非递归写法

void MergeSortNonR(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}// gap每组归并数据的数据个数int gap = 1;while (gap < n){for (int i = 0; i < n; i += 2 * gap)//因为gap组和gap组归并,所以i += 2 * gap;i表示每组归并的起始位置{// [begin1, end1][begin2, end2]int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;// 第二组都越界不存在,这一组就不需要归并if (begin2 >= n)break;// 第二的组begin2没越界,end2越界了,需要修正一下,继续归并if (end2 >= n)end2 = n - 1;int j = i;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] <= a[begin2]){tmp[j++] = a[begin1++];}else{tmp[j++] = a[begin2++];}}while (begin1 <= end1){tmp[j++] = a[begin1++];}while (begin2 <= end2){tmp[j++] = a[begin2++];}memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));}gap *= 2;//1 1归并、2 2归并、4 4归并……}free(tmp);tmp = NULL;
}

二、计数排序

1.基本思想

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

①统计相同元素出现次数。

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

2.代码展示

void CountSort(int* a, int n)
{int min = a[0], max = a[0];for (int i = 1; i < n; i++){if (a[i] < min)min = a[i];if (a[i] > max)max = a[i];}int range = max - min + 1;int* count = (int*)calloc(range, sizeof(int));if (count == NULL){perror("calloc fail");return;}// 统计次数for (int i = 0; i < n; i++){count[a[i] - min]++;}// 排序int j = 0;for (int i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}}free(count);
}

3.计数排序特性总结

①基数排序在数据范围集中时效率很高,但适用范围及场景有限(只适合整数)。

②时间复杂度:O(MAX(N,范围))。

③空间复杂度:O(范围)。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 论文翻译:Benchmarking Large Language Models in Retrieval-Augmented Generation
  • Python中常见数据结构
  • Python酷库之旅-第三方库Pandas(093)
  • 【iOS】——响应者链和事件传递链
  • Redis7基础篇(七)
  • 【题解】【结构体排序】—— [NOIP2009 普及组] 分数线划定
  • JavaScript 手写仿freeze
  • HTML详解
  • Java面试题———MySql篇②
  • 【C++ 面试 - 面向对象】每日 3 题(七)
  • Linux驱动学习之点灯(六,利用平台设备总线)
  • Element-UI Table实现列表筛选数据及列表嵌套选择框
  • 从行为面试问题(behavioral questions)看中美程序员差异。
  • <数据集>流水线纸箱识别数据集<目标检测>
  • AIoTedge边缘物联网平台发布,更低的价格,更强大的功能
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【技术性】Search知识
  • javascript 哈希表
  • JavaScript函数式编程(一)
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Node项目之评分系统(二)- 数据库设计
  • PV统计优化设计
  • springboot_database项目介绍
  • v-if和v-for连用出现的问题
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端js -- this指向总结。
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 微信支付JSAPI,实测!终极方案
  • 携程小程序初体验
  • ​【已解决】npm install​卡主不动的情况
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 透过事物看本质的能力怎么培养?
  • ###项目技术发展史
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (7) cmake 编译C++程序(二)
  • (二)c52学习之旅-简单了解单片机
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (新)网络工程师考点串讲与真题详解
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • .a文件和.so文件
  • .net core 外观者设计模式 实现,多种支付选择
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET MVC 验证码
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net SqlSugarHelper