算法分析 - 桶式排序


桶式排序

在我们生活的这个世界中到处都是被排序过的东东。站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在。现在我们举个具体的例子来介绍一下排序算法。

特点

1.桶排序是稳定的
2.桶排序是常见排序里最快的一种,比快排还要快…大多数情况下
3.桶排序非 常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法

步骤解析

例如待排数字[6 2 4 1 5 9]

准备10个空桶,最大数个空桶

[6 2 4 1 5 9] 待排数组

[0 0 0 0 0 0 0 0 0 0] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

1,顺序从待排数组中取出数字,首先6被取出,然后把6入6号桶,这个过程类似这样:空桶[ 待排数组[ 0 ] ] = 待排数组[ 0 ]

[6 2 4 1 5 9] 待排数组

[0 0 0 0 0 0 6 0 0 0] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

2,顺序从待排数组中取出下一个数字,此时2被取出,将其放入2号桶,是几就放几号桶

[6 2 4 1 5 9] 待排数组

[0 0 2 0 0 0 6 0 0 0] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

3,4,5,6省略,过程一样,全部入桶后变成下边这样

[6 2 4 1 5 9] 待排数组

[0 1 2 0 4 5 6 0 0 9] 空桶

[0 1 2 3 4 5 6 7 8 9] 桶编号(实际不存在)

0表示空桶,跳过,顺序取出即可:1 2 4 5 6 9

代码块

代码块语法遵循标准markdown代码,例如:

// 桶式排序
- (void)bucketSort:(NSMutableArray*)dataList min:(NSInteger)min max:(NSInteger)max{

    // 初始化 桶
    NSMutableArray * buckets = [NSMutableArray arrayWithCapacity:max - min];
    for (int i = 0; i< max - min; i++) {
        [buckets addObject:@"0"];
    }
    // 把相应的对象放入对应的桶
    for (int i = 0; i < dataList.count; i++) {

        NSInteger index = [dataList[i] integerValue] - min;
        NSInteger item = [[buckets objectAtIndex:index] integerValue];

        [buckets setObject:[NSString stringWithFormat:@"%d",(int)item+1] atIndexedSubscript:index];

    }
    NSLog(@"1 buckets  %@",buckets);

    // 计算各桶内的元素在有序序列中的位置
    for (int i = 1; i < max - min; i++) {
        NSInteger index = [buckets[i] integerValue] + [buckets[i - 1] integerValue];
        buckets[i] = [NSString stringWithFormat:@"%d",(int)index];

    }

    NSLog(@"2 buckets  %@",buckets);

     根据buckets数组中的位置信息将待排序列的各元素放入相应位置
    NSMutableArray * temp = [NSMutableArray arrayWithArray:dataList];
    for (NSInteger k = dataList.count -1; k>=0; k--) {

        NSInteger buckIndex =  [temp[k] integerValue] -min;
        NSInteger bucketsObj = [buckets[buckIndex] integerValue];
        NSInteger IndexedSubscrip = bucketsObj-1;
        [dataList setObject:temp[k] atIndexedSubscript:IndexedSubscrip];
        [buckets setObject:[NSString stringWithFormat:@"%d",(int)IndexedSubscrip] atIndexedSubscript:buckIndex];
    }
    NSLog(@"3 dataList  %@",dataList);

}

** 代码写的比较仓促,各位看官看懂 算法即可,勿要强求代码风格

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值