算法-键索引计数法

简介:

键索引计数法适合于整数分为较小的简单排序方法,基本的步骤分为四步:

1.统计每个分类出现的次数;

2.将分类的次数转换为对应的索引;

3.通过中间数组按照分类的权重对原始数组排序;

4.将排序之后中间数组赋值给原始数组;

基础定义

首先定义排序需要的需要类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@ interface  keyIndexModel:NSObject
 
@property  (assign,nonatomic)  NSInteger  key;
 
@property  (strong,nonatomic)  NSString  *value;
 
-(instancetype)initWithKeyValue:(NSInteger)key  value:(NSString *)value;
 
@end
 
@ interface  KeyIndexSort : NSObject
 
-( void )sort:(NSMutableArray *)dataSource categoryNumber:(NSInteger)number;
 
@end

  实现具体排序方法:

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
-( void )sort:(NSMutableArray *)dataSource categoryNumber:(NSInteger)number{
     NSInteger  len=[dataSource count];
     NSMutableArray  *tempArr=[[NSMutableArray alloc]initWithCapacity:1];
     //http://www.cnblogs.com/xiaofeixiang/
     for  (NSInteger i=0; i<len; i++) {
         [tempArr addObject:[NSNull  null ]];
     }
     NSMutableArray *count=[[NSMutableArray alloc]initWithCapacity:1];
     for  (NSInteger i=0; i<number+1; i++) {
         [count addObject:[NSNumber numberWithInteger:0]];
     }
     //统计每个分类的次数
     for  (NSInteger i=0;i<len; i++) {
         keyIndexModel  *model=dataSource[i];
         count[model.key+1]=[NSNumber numberWithInteger:[count[model.key+1] integerValue]+1];
     }
     
     //将出现的次数转换为索引,第一组3次,第二组5次,因此对应第三组开始的索引是8
     for  (NSInteger j=0; j<number; j++) {
         count[j+1]=[NSNumber numberWithInteger:[count[j] integerValue]+[count[j+1] integerValue]];
     }
     //将元素从上到下分类
     for  (NSInteger m=0; m<len; m++) {
         keyIndexModel  *model=dataSource[m];
         tempArr[[count[model.key] integerValue]]=model;
         count[model.key]=[NSNumber numberWithInteger:[count[model.key] integerValue]+1];
     }
     //重新排序赋值
     for  (NSInteger i=0; i<len; i++) {
         dataSource[i]=tempArr[i];
     }
     
}

排序测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
NSMutableArray  *dataSource=[[NSMutableArray alloc]initWithCapacity:1];
[dataSource addObject: [[keyIndexModel alloc]initWithKeyValue:0 value: @"FlyElephant" ]];
[dataSource addObject: [[keyIndexModel alloc]initWithKeyValue:1 value: @"keso" ]];
[dataSource addObject: [[keyIndexModel alloc]initWithKeyValue:2 value: @"中山郎" ]];
[dataSource addObject: [[keyIndexModel alloc]initWithKeyValue:3 value: @"http://www.cnblogs.com/xiaofeixiang/" ]];
[dataSource addObject: [[keyIndexModel alloc]initWithKeyValue:3 value: @"iOS技术交流:228407086" ]];
 
[dataSource addObject: [[keyIndexModel alloc]initWithKeyValue:2 value: @"北京" ]];
[dataSource addObject: [[keyIndexModel alloc]initWithKeyValue:1 value: @"上海" ]];
[dataSource addObject: [[keyIndexModel alloc]initWithKeyValue:3 value: @"深圳" ]];
[dataSource addObject: [[keyIndexModel alloc]initWithKeyValue:2 value: @"广州" ]];
[dataSource addObject: [[keyIndexModel alloc]initWithKeyValue:0 value: @"河南" ]];
 
KeyIndexSort  *indexSort=[[KeyIndexSort alloc]init];
[indexSort sort:dataSource categoryNumber:5];
  [dataSource enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
      keyIndexModel  *model=obj;
      NSLog( @"%ld--%@" ,idx,model.value);
  }];

 排序结果:

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4855240.html,如需转载请自行联系原作者
相关文章
|
存储 算法 关系型数据库
深入理解InnoDB索引数据结构和算法
1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。 2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。 3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。 4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。 5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。 **总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。
907 0
深入理解InnoDB索引数据结构和算法
|
算法 索引
|
4月前
|
存储 监控 算法
电脑监控管理中的 C# 哈希表进程资源索引算法
哈希表凭借O(1)查询效率、动态增删性能及低内存开销,适配电脑监控系统对进程资源数据的实时索引需求。通过定制哈希函数与链地址法冲突解决,实现高效进程状态追踪与异常预警。
259 10
基于光流法的车辆检测计数算法matlab仿真,对比Horn-Schunck光流和Lucas-Kanade光流
基于光流法的车辆检测计数算法matlab仿真,对比Horn-Schunck光流和Lucas-Kanade光流
|
4月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
447 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
10月前
|
存储 算法 C++
Windows共享文件:探秘C++实现的B树索引算法奇境
在数字化时代,Windows共享文件的高效管理至关重要。B树算法以其自平衡多路搜索特性,在文件索引与存储优化中表现出色。本文探讨B树在Windows共享文件中的应用,通过C++实现具体代码,展示其构建文件索引、优化数据存储的能力,提升文件检索效率。B树通过减少磁盘I/O操作,确保查询高效,为企业和个人提供流畅的文件共享体验。
|
5月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
168 3
|
7月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
215 4
|
算法 索引
【算法】二分算法——山脉数组的峰顶索引
【算法】二分算法——山脉数组的峰顶索引
|
存储 算法 物联网
R-Tree算法:空间索引的高效解决方案
【5月更文挑战第17天】R-Tree是用于多维空间索引的数据结构,常用于地理信息系统、数据库和计算机图形学。它通过分层矩形区域组织数据,支持快速查询。文章介绍了R-Tree的工作原理、应用场景,如地理信息存储和查询,以及Python的`rtree`库实现示例。此外,还讨论了R-Tree的优势(如空间效率和查询性能)与挑战(如实现复杂和内存消耗),以及优化和变种,如R* Tree和STR。R-Tree在机器学习、实时数据分析等领域有广泛应用,并与其他数据结构(如kd-trees和quad-trees)进行比较。未来趋势将聚焦于优化算法、动态适应性和分布式并行计算。
877 1