计数排序(Counting Sort)

1. 算法描述

计数排序(Counting Sort)不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

  • 找出待排序的数组中最大和最小的元素,计算出存储数据作为数组下标,存储数据出现频率的数组范围;
  • 通过(value - min),计算出数据对应的下标,存入频率数组,出现1次值为1,以后++;
  • 反向填充目标数组:便利频率数组,通过index反向计算出原始值(index + min),依次加入目标数组。
2. 过程演示
Counting Sort.gif
计数排序

原始数据

8 2  6  9  4  3  2  6 4 5


min = 2
max = 9

count = max - min + 1 = 8;

// 开始计算

0  0   0   0  0  0  1 0

1  0   0   0  0  0  1  0

1  0   0   0  1  0  1  0

1  0   0   0  1  0  1  1

1  0   1   0  1  0  1  1

1  1   1   0  1  0  1  1

2  1   1   0  1  0  1  1

2  1   1   0  2  0  1  1

2  1   2   0  2  0  1  1

2  1   2   1  2  0  1  1


// 初始化已排序数组

0 0 0 0 0 0 0 0 0 0

// 开始导入

2 2 0 0 0 0 0 0 0 0

2 2 3 0 0 0 0 0 0 0

2 2 3 4 4 0 0 0 0 0

2 2 3 4 4 5 0 0 0 0 

2 2 3 4 4 5 6 6 0 0 

2 2 3 4 4 5 6 6 8 0 

2 2 3 4 4 5 6 6 8 9 

3. 代码实现
/*
 * 计数排序
 */
- (NSArray *)countingSort:(NSArray *)sortArray {
    
    NSInteger min = [[sortArray valueForKeyPath:@"@min.integerValue"] integerValue];
    NSInteger max = [[sortArray valueForKeyPath:@"@max.integerValue"] integerValue];
    
    NSInteger rateCount = max -min + 1;
    NSMutableArray *rate = [NSMutableArray arrayWithCapacity:rateCount];
    
    // 注入一个存储 count的数组
    for (int i = 0; i < rateCount; i ++) {
        [rate addObject:@(0)];
        self.count1 ++;
    }
    
    // 把 相同的值减去最小值  作为下标 个数作为值 存入数组
    for (int i = 0; i < sortArray.count; i ++) {
        NSInteger rateNumber = [sortArray[i] integerValue] - min;
        rate[rateNumber] = @([rate[rateNumber] integerValue] + 1);
        self.count1 ++;
    }

    NSMutableArray *sorted = [NSMutableArray array];
    for (int i = 0; i < rate.count; i ++) {
        NSInteger count = [rate[i] integerValue];
        for (int j = 0; j < count; j ++) {
            NSInteger value = i + min;
            [sorted addObject:@(value)];
            self.count1 ++;
        }
    }
    return sorted.copy;
}

4. 验证
 NSArray *arr = [self pakageNumber:1000];    
 NSArray *arr1 =  [self countingSort:arr];
count1  :3000                        // 外层循环

一万条数据所用时间
time:0.009548s;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂...
    Awanwan阅读 3,251评论 0 0
  • 计数排序的前提是长度为n数组里面的元素为整数并且元素值的范围为0~k,时间复杂度为O(n+k),当k=O(n)时,...
    spraysss阅读 4,417评论 0 1
  • 我想说,我没有忘记你说的话;我想说,我有遵守对你的承诺;我想说,我有把你成朋友;我想说,我也不知道怎么会变成这样;...
    慕勤勉阅读 2,738评论 2 1
  • 我的90天目标:1.健康:每天早起六点,晚睡十点,每天坚持运动锻炼半一小时 2.学习:每天学习时间管理课100讲,...
    薇_f50b阅读 1,576评论 0 0
  • 茶香四溢的爱(原) 2009-04-08 01:32:26| 分类: 默认分类|举报|字号 订阅 下载LOFTE...
    随风听雪阅读 2,144评论 0 0

友情链接更多精彩内容