【问题标题】:Bucket Sort implementation in Objective CObjective C 中的桶排序实现
【发布时间】:2017-12-05 17:22:19
【问题描述】:

我一直在 Objective-C 中实现不同的排序算法(快速排序、归并排序、冒泡排序)。但是我还没有找到任何明确的桶排序算法实现

我正在尝试在目标 C 中找到一个简单有效的桶排序算法实现。

【问题讨论】:

    标签: objective-c algorithm sorting bucket-sort


    【解决方案1】:

    我最终自己做了,如果有人需要,这是我的实现:

    - (NSArray*)bucketSort:(NSArray<NSNumber*> *)array buckets:(NSInteger)k {
    
        // Initialize array of buckets
        NSMutableArray<NSMutableArray*> *buckets = [NSMutableArray arrayWithCapacity:k];
        for (int i=0; i < buckets.count; i++)
            buckets[i] = [NSMutableArray new];
    
        // Add elements to buckets
        for (int i=0; i < buckets.count; i++) {
            NSInteger index = k * array[i].floatValue; // Asuming "array" has values between 0 and 1
            if (index < buckets.count) [buckets[index] addObject:array[i]];
        }
    
        NSMutableArray *sortedArray = [NSMutableArray new];
    
        // Sort individual buckets
        // Concatenate all sorted buckets in order
        for (int i=0; i < buckets.count; i++) {
            buckets[i] = [self quickSort:buckets[i]]; // Sorting algorithm like quicksort/mergesort/insertionsort
            [sortedArray addObjectsFromArray:buckets[i]];
        }
    
        return sortedArray;
    }
    

    【讨论】:

    • 你有一个if 没有else 时向桶添加元素,所以if 是多余的某些元素无法添加到任何桶.您还可以通过组合最后两个循环使其更“高效”,但您必须确定这是否符合您的“简单”目标。 (使用 Obj-C 数组对浮点数进行排序当然不会特别有效,但这与算法本身的有效实现是正交的。)HTH
    • @CRD 你是对的,没有elseif 是有意的,它只是一个安全检查,不要超出数组的范围并使程序崩溃。异常或错误报告应该在else 上进行。感谢您对最后两个循环的注释,我将更正解决方案。你会推荐一个不同的集合来在 Obj-C 中实现这个算法吗?
    • 如果你真的要对大量基本值(整数、浮点数)进行排序,那么使用标准 C 值数组(可以动态分配)将比 Objective-C 对象数组(其中数组本身是一个对象,并且包含包装为对象的值)。这与排序算法无关。对于少量值(因此开销可以忽略不计),当然对于对象,您通常会使用基于对象的集合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多