算法记录:MSD基数排序 + qsort 对字符串排序

基数排序MSD和LSD实现和比较 基数排序的关键是“多关键词排序基数排序(Radix Sort)是一种非比较的排序算法,它根据元素的各个位上的值将元素进行排序。它可以分为最低有效位优先(LSD)和最高有效位优先(MSD)两种实现方式。 阅读详情
typedef std::vector<std::string>  t_vstr;
void exch(std::string &str1, std::string &str2)
{
  std::swap(str1, str2);
}

void str_qsort_internal(t_vstr &arr, int l, int r, size_t d)
{
  if(l >= r)return;

  int i = l - 1, j = r;
  int p = i, q = j;
  char v = arr[r][d];
  while(i < j)
  {
    while(arr[++i][d] < v); //i是第一个大于等于v的索引,可能等于r(到r时一定停止循环)
    while(v < arr[--j][d]) {if(j == l) break; } //j是第一个小于等于v的,当j == l时循环也会结束,例如所有元素都比arr[r]大
    
    if(i > j) break;
    exch(arr[i], arr[j]); //交换,要么是arr[i] >= v && arr[j] <= v 之后 arr[i] <= v && arr[j] >= v
    if(arr[i][d] == v) exch(arr[i], arr[++p]);//arr[p]一定小于等于v,
    if(arr[j][d] == v) exch(arr[j], arr[--q]); //arr[q]一定大于等于v
  }
  
  if(p == q)//如果p == q则证明l -> r区间全相等
  {
    if(v != '/0')str_qsort_internal(arr, l, r, d + 1);//如果不为字符串结尾,则转换到下一层,如果v为'/0'则证明排序完毕
    return;
  }
  
  if(arr[i][d] < v)i++;
/*
下面两个移动算法类似下图
    p  
4,4,4,1,2,3
k         j

3,4,4,1,2,4
  k     j

3,2,4,1,4,4
    k j
3,2,1,4,4,4
    j 4

      p
4,4,4,4,2
k       j
2,4,4,4,4
  k   j
2,4,4,4,4
    kj
2,4,4,4,4
  j   k

*/
  for(int k = l; k <= p; ++k, --j) exch(arr[k], arr[j]); //l -> j区间元素都是小于等于v的,而l -> p都是等于v的,
  for(int k = r; k >= q; --k, ++i) exch(arr[k], arr[i]);  //i->r区间元素都是大于等于v的,而i->r都是等于v的

  str_qsort_internal(arr, l, j, d);//因为i -> j区间内不一定都是相同的,但一定都小于等于v
  if((i == r) && (arr[i][d] == v)) i++;//这里,如果i == r && arr[i][d] == v,则证明从j + 1到 r都是相同的元素,所以i+=1照应下一步的 i - 1 和str_qsort_internal(arr, i, r, d);因为i + 1之后,i 就一定大于r了
  
  if(v != '/0') str_qsort_internal(arr, j + 1, i - 1, d+1);//如果v == 0,那么j+1 -> i-1区间内的所有字符串都为结尾,所以无需递归排序了

  str_qsort_internal(arr, i, r, d);//同理,因为i -> 区间内不应定都是相同的,但一定都大于等于v, 因此搜索层次还是d
}

void print_vstr(const t_vstr &vstr)
{
  for(size_t i = 0; i < vstr.size(); ++i)
  {

    printf("%s/n", vstr[i].c_str());
  }

}

int main()
{  
  t_vstr vstr;
  
  vstr.push_back("9");
  vstr.push_back("123");
  vstr.push_back("232");
  vstr.push_back("234");
  vstr.push_back("456");
  vstr.push_back("789");
  vstr.push_back("259");
  vstr.push_back("257");


  str_qsort_internal(vstr, 0, vstr.size() - 1, 0);
  print_vstr(vstr);
  
  
  



  printf("done/n");
  cin.get();

  return 0;
};

 
掌握字符串排序:LSD与MSD算法原理与实践 本文深入解析了LSD和MSD字符串排序算法的原理和实践应用。LSD排序以其稳定性和线性时间复杂度成为排序固定长度字符串的理想选择,而MSD排序则为处理可变长度字符串提供了一种高效的递归策略。文章通过代码示例和理论证明,探讨了两种算法的实现细节和性能考量。 阅读详情

相关推荐

MSD基数排序

基数排序,分为LSD 和MSD,LSD应该简单一些,在此本人将MSD算法贴出来。

【排序算法】基数排序:LSD 与 MSD

1.算法原理 基数排序是通过“分配”和“收集”过程来实现排序。 1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中) 2)收集,再将放置在0~9号桶中的数据按顺序放到数组中 重复(1)(2)过程,从个位到最高位(比如32位无符号整形最大数4294967296,最高位10位)。而这个思想该如何理解呢?请看以下例子。 (1)

summer 1万+

Axure原型模板与元件库APP交互设计素材(附资料)

在Axure中,手机模型是展示APP或小程序界面效果的重要工具。通过导入手机模型元件,设计师可以更加直观地模拟真实设备的显示效果,从而更准确地评估设计的可行性和用户体验。Axure官方及第三方资源库中提供了多种品牌和型号的手机模型,如iPhone、Android等,设计师可以根据项目需求选择合适的模型进行使用。Axure作为一款强大的原型设计工具,为APP和小程序的设计与开发提供了丰富的界面组件元件库和交互设计素材。

招风的黑耳优快云 1980

基数排序——多关键字排序(MSD/LSD)以及链式基数排序

排序9.6 基数排序9.6.1 多关键字排序9.6.2 链式基数排序 9.6 基数排序 基数排序又被称为桶排序。与前面介绍的几种排序方法相比较,基数排序和它们有明显的不同。前面所介绍的排序方法都是建立在对数据元素关键字进行比较的基础上,所以可以称为基于比较的排排序;而基数排序首先将待排序数据元素依次“分配”到不同的桶里,然后再把各桶中的数据元素“收集”到一起。通过使用对多关键字进行排序的这种**“分配”和“收集”的方法,基数排序实现对单关键字**进行排序。 9.6.1 多关键字排序 一般情况下,假定数据表

lseaJK的博客 6798

STM32F429移植LVGL9.3.0:从源码配置到双缓冲优化实战

本文详细介绍了如何在STM32F429平台上移植LVGL 9.3.0图形库,涵盖从源码准备、工程配置、显示驱动适配到双缓冲优化等关键步骤。重点解析了利用STM32F429的硬件特性实现高效内存管理和流畅显示性能的实战技巧,为嵌入式GUI开发提供完整解决方案。

q6r7s8t9的博客 1133

10X Visium空间转录组学入门:从芯片结构到数据分析全流程解析(附避坑指南)

本文全面解析10X Visium空间转录组学技术,从芯片物理结构、探针化学原理到湿实验全流程操作与避坑指南,并详细介绍了从FASTQ数据到空间可视化的核心分析流程。文章旨在帮助科研人员跨越从理论到实操的鸿沟,掌握从样本准备、文库构建到使用Space Ranger和Seurat进行数据分析与可视化的完整路径,为组织生物学研究提供清晰的实践指引。

weixin_29306011的博客 163

基数排序详解(LSD方法+MSD方法+思路+图解+代码)

基数排序:LSD排序法+MSD排序法

WengJM的博客 5139

嘉立创EDA报错:元件引脚与焊盘未对应报错解决记录

原件引脚与焊盘未对应报错解决方法,一文总结!

2303_77013775的博客 1万+

【数据结构】排序算法---基数排序(动图演示)

基数排序算法详细讲解,并且还含有动态演示

2301_80191662的博客 2957

边缘计算【智能+安全检测】系列教程--使用OpenCV+GStreamer实现真正的硬解码,完全消除马赛克

通过现有博客的GStreamer的解码方式解码,大多情况应该存在上图马赛克的问题,请勿紧张,其实上述url并没有调用硬件解码,后面有调用硬件解码的ULR,我们来在接下来的介绍中释获。通过RTSP协议连接海康威视摄像头将图片送入AI推理,发现OpenCV的VideoCapture使用的是软解码大量消耗了cpu的资源,并无法做到实时数据处理存在5秒钟的延时。只能把解码这部分送到硬件解码器去处理分摊掉cpu的压力,

Starry-SkyJing的博客 2427

Kubernetes集群环境搭建与初始化

Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

m0_75254642的博客 1525

排序算法10——图解基数排序(次位优先法LSD和主位优先法MSD)

基数排序的概念 基数排序是桶排序的一种推广。 给定N个记录,每个记录的关键字为一整数,取值范围在0到M之间 之前提到的桶排序是在N远大于M的情况下使用的。 若如果M比N大很多,这时桶排序就需要M个桶,会造成巨大的控件浪费。 而以R为基数对关键字进行分解以后,就只需要R个桶就可以了。 例如: 对于数字826 如果根据基数10来分解,可以得到8、2、6三个关键字, 其中8是最主位关键字,6是最次...

优快云_dzh的博客 6534

变压器励磁电感、励磁电流、漏感、漏感折算

励磁、漏感知识整理

HW-BASE的博客 1万+

十大经典排序算法全解析:从原理到实战选型指南

排序是计算机科学中最基础且频繁的操作,其核心在于通过比较和交换数据元素,使序列按特定顺序排列。理解排序算法的关键在于掌握其时间复杂度和空间复杂度,这决定了算法在处理不同规模数据时的效率。高效的排序算法(如O(n log n)级别)是构建高性能、高可用系统的技术基石,广泛应用于数据库索引、大数据处理、内存管理和实时系统等场景。本文聚焦于数据结构与算法中的十大经典排序算法,深入剖析其核心思想、性能特点及适用场景,并特别探讨了**快速排序**的平均性能优势以及**计数排序**在特定数据条件下的线性时间复杂度,为工

weixin_30443747的博客 480

目标检测YOLO实战应用案例100讲-基于YOLOv7的番茄采摘机械手场景感知及试验(下)

根据软件系统的设计需求,制定系统的可行性方案分析,编写系统的相关程序和 调试运行环境,对系统进行测试,以实现对番茄数据的采集及监测。登陆界面登陆后,进入选择界面,菜单包括了对番茄种植棚室的固定相机数据的监测、 对番茄采摘机械手的双目相机采集的番茄的静态、动态数据的获取、对番茄静态、动态数 据处理的功能菜单等选项。与利用人工去进行对于番茄果实的识别和数目的统计相比,番茄视觉系统自动记录番 茄数量以及红色已经成熟的番茄、青色未成熟番茄的数量,减轻人工记录的工作量,减少 人工记录的误差,从经济方面是可行的。

qq_36130719的博客 812

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

工业级排序算法实战:Timsort、Introsort与Radix Sort原理及调优

排序算法是数据处理的底层基石,其性能不仅取决于时间复杂度,更受内存访问模式、CPU缓存行为、分支预测效率和硬件特性深度制约。Timsort凭借自适应run识别与稳定合并策略,在局部有序数据(如日志、时序流)中实现近线性性能;Introsort通过递归深度监控、三数取中pivot与小数组插入优化,为快排注入确定性保障;Radix Sort则绕过比较操作,在整数、IP、字符串等固定键长场景下突破O(n log n)理论瓶颈。这些工业级实现广泛应用于Java/Python排序库、Linux内核、PostgreSQ

weixin_30861797的博客 369

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

详解基数排序

1.基数排序 基数排序是一种特殊的排序方式,不是基于比较进行排序,而是基于关键字的各个位置大小进行"分配"和"收集"两种操作对关键字序列进行排序的一种排序方式。 基数排序可以分为:最高位优先(MSD)和最低位优先(LSD) 2.基数排序原理 1.观察排序字段最大的数字,它有几位决定了需要分配和收集的次数 2.按照元素每一位的大小分配入对应容器(如数组,链表,队列等) 3.按照容器的次序依次收集数据 4.重复前两步,直至每一位都分配,收集完毕 例如: 3.代码实现 本算法使用链表作

qq_51950769的博客 3275

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

5种方法计算均方位移MSD

5种方法计算均方根位移MSD(1)lammps计算(2)VMD计算(3)OVITO计算(4)ISAACS软件计算(5)自编程计算 在统计力学中,均方位移(MSD,均方位移或均方波动)是粒子随时间移动后的位置相对于参考位置的偏差的量度。它是随机运动中空间范围的最常见度量,可以被认为是对随机行者“探索”的系统部分进行度量。在生物物理学和环境工程领域,均方根位移是随时间测量的,以确定粒子是否仅由于扩散而扩散,或者对流力是否也在起作用。

weixin_45896923的博客 3万+

排序算法之基数排序

基数排序:根据键值的每位数字来分配桶;计数排序:每个桶只存储单一键值;桶排序:每个桶存储一定范围的数值;基数排序不是直接根据元素整体的大小进行元素比较,而是将原始列表元素分成多个部分,对每一部分按一定的规则进行排序,进而形成最终的有序列表。

1801

基数排序详解:LSD和MSD的实现与比较

基数排序是一种基于“位”的排序算法,通过将数据按位进行多次排序来实现最终的排序效果。它特别适用于整数和字符串的排序。基数排序有两种主要的变种:LSD和MSD,它们的主要区别在于排序的方向。通过将计数排序抽象出来,我们简化了LSD和MSD基数排序的实现。这样不仅提高了代码的复用性和可读性,也使得修改和扩展算法变得更加容易。无论是从最低有效位开始排序的LSD基数排序,还是从最高有效位开始排序的MSD基数排序,都可以利用同一个计数排序模块来实现其核心功能。

qq_52010229的博客 1295

图像匹配算法 MAD、SAD、SSD、MSD、NCC、SSDA、SATD,LBD算法

图像匹配算法分为3类:基于灰度的匹配算法、基于特征的匹配算法、基于关系的匹配算法 (1)基于灰度的模板匹配算法:模板匹配(Blocking Matching)是根据已知模板图像到另一幅图像中寻找与模板图像相似的子图像。基于灰度的匹配算法也称作相关匹配算法,用空间二维滑动模板进行匹配,不同匹配算法主要体现在相关准则的选择方面,常见的基于模板的匹配算法可以参考下面的链接: 参考:http://bl...

Ring__Rain的博客 9512

基数排序中的LSD方法和MSD方法

最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。 最低位优先(Least Significant Digit first)法,简称LSD法:先从kd开始排序,再对

坚持 6474

基于灰度的模板匹配算法:MAD、SAD、SSD、MSD、NCC、SSDA算法

简介:        本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD)、绝对误差和算法(SAD)、误差平方和算法(SSD)、平均误差平方和算法(MSD)、归一化积相关算法(NCC)、序贯相似性算法(SSDA)。下面依次对其进行讲解。 MAD算法 介绍         平均绝对差算法(Mean Absolute Differences,简称MAD算法),它是Leese在197...

博博有个大大大的Dream 3232

基数排序(LSD+MSD)详解

一.计数排序 二.基数排序

小学弟的博客 3万+

字符串低位优先排序(LSD)和高位优先排序(MSD)原理及C++实现

前言:        最近正好在学习字符串相关的算法,写了下LSD、MSD以及三向快速排序算法,写完了过后有很大的感触,所以决定把这几天所学习的东西记录下来。原理:键索引计数法:        在开始介绍LSD以及MSD算法之前,我们要介绍一个算法——键索引计数法,这是LSD以及MSD的基础。        键索引计数法允许我们通过一定的键值来对字符串进行排序,一个很好的例子就是分组——每个学生对...

weixin_41427400的博客 5985

基数排序

简介 基数排序和桶排序有些像,都不需要比较数据大小,而其他排序算法要。 基数排序分为以下两类 一.最高位优先(Most Significant Digit first)法,简称MSD法: 先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。 ...

weixin_30621711的博客 130
上一篇: 算法记录:堆排序
下一篇: 关于Thunk
SolidusSnake
博客等级 码龄20年 1粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值