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

算法-三向字符串快速排序

根据高位优先的字符串排序的思想我们可以改进快速排序算法,根据键的首字母进行三向切分,将两者结合起来就是可以理解的高效排序算法-三向字符串快速排序。三向字符串快速排序是一个字符串排序的通用算法,最多的情况适用于含有公共前缀的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
-(NSInteger)charAt:(NSString *)str index:(NSInteger)index{
     if  (index<str.length) {
         return  [str characterAtIndex:index]-97;
     } else {
         return  -1;
     }
}
 
-( void )exchange:(NSMutableArray *)dataSource  first:(NSInteger)first  second:(NSInteger)second{
     NSString  *temp=dataSource[first];
     dataSource[first]=dataSource[second];
     dataSource[second]=temp;
}
 
-( void )sort:(NSMutableArray *)dataSource{
     [self sort:dataSource low:0 high:[dataSource count]-1 index:0];
}
 
-( void )sort:(NSMutableArray *)dataSource  low:(NSInteger)low  high:(NSInteger)high  index:(NSInteger)index{
     if  (high<=low) {
         return ;
     }
     NSInteger left=low,right=high;
     NSInteger  middle=[self charAt:dataSource[low] index:index];
     NSInteger i=low+1;
     while  (i<=right) {
         NSInteger t=[self charAt:dataSource[i] index:index];
         if  (t<middle) {
             [self exchange:dataSource first:left++ second:i++];
         } else  if (t>middle){
             [self exchange:dataSource first:i second:right--];
         } else {
             i++;
         }
     }
     [self sort:dataSource low:low high:left-1 index:index];
     if  (middle>=0) {
         [self sort:dataSource low:left high:right index:index+1];
     }
     [self sort:dataSource low:right+1 high:high index:index];
}

 代码测试:

1
2
3
4
5
6
7
8
Quick3String  *quick=[[Quick3String alloc]init];
NSMutableArray  *dataSource=[[NSMutableArray alloc]initWithObjects: @"xiang" , @"girl" , @"he" , @"fei" , @"keso" , @"fly" , @"elephant" , @"de" , @"" , @"she" , @"elephant" ,nil];
   [quick sort:dataSource];
[dataSource enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
     NSLog( @"%@" ,obj);
}];
NSLog( @"技术交流群:%@" , @"228407086" );
NSLog( @"博客园-FlyElephant:http://www.cnblogs.com/xiaofeixiang" );

 测试效果:

 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4857404.html,如需转载请自行联系原作者

相关文章:

  • 国内互联网医疗的反思和2016年9大前沿趋势
  • 选择服务器托管都有哪些优势和不足
  • SpringBoot使用教程【1】Restful API设计 返回json,xml格式
  • weblogic部署web项目出现错误
  • 自制字幕遮挡器
  • CYQ.Data 轻量数据层之路 抢先体验版本功能说明演示 (二十九)
  • 性能测试解惑之并发压力
  • AWS CTO:“我真心讨厌跟软件工具供应商打交道”
  • 思科发现英特尔集成显卡驱动存在安全漏洞 可任意执行代码
  • 为何科技独角兽接连上市
  • 秒表---框架搭建
  • 【转】maven命令-P 参数引发的思考
  • Chapter3_操作符_关系操作符
  • 安全抽象:网络安全生态系统从复杂臃肿到有效自动化的发展之道
  • loadrunner
  • 0基础学习移动端适配
  • Apache Pulsar 2.1 重磅发布
  • iOS 系统授权开发
  • JavaScript 奇技淫巧
  • Python连接Oracle
  • Rancher-k8s加速安装文档
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spark RDD学习: aggregate函数
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Vim Clutch | 面向脚踏板编程……
  • 成为一名优秀的Developer的书单
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 分布式任务队列Celery
  • 理解在java “”i=i++;”所发生的事情
  • 前端学习笔记之观察者模式
  • 使用Swoole加速Laravel(正式环境中)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 写给高年级小学生看的《Bash 指南》
  • 新版博客前端前瞻
  • 赢得Docker挑战最佳实践
  • 数据库巡检项
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • !$boo在php中什么意思,php前戏
  • #FPGA(基础知识)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (小白学Java)Java简介和基本配置
  • (一)基于IDEA的JAVA基础1
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net 简单实现MD5
  • .NET中使用Redis (二)
  • @Repository 注解
  • @Transactional 详解
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [android学习笔记]学习jni编程
  • [Angular] 笔记 7:模块