Objective-C快速枚举冒泡排序

时间:2011-02-09 01:22:39

标签: objective-c objective-c-blocks fast-enumeration

我正在尝试将一些GCD集成到我的代码中,并且发现严重的瓶颈是我在大型数组中的对象之间执行的气泡比较。这是原始代码:

NSUInteger count = [arrayToDoWorkOn count];
for (int i = 0; i < count; i++)
{
    for (int j = i + 1; j < count; j++)
    {
        [[arrayToDoWorkOn objectAtIndex:i] compare:[arrayToDoWorkOn objectAtIndex:j]];
    }
}

让我的漂移?因此,许多其他快速枚举任务可以通过转换轻松进行GCD。

for (id obj in array)
{
    [obj aMessage:stuff];
}

为:

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
    [obj aMessage:stuff];
}];

有没有办法将我的前瞻 - sorta-bubble-sorta-algorithm-thing转换为可以提供给GCD块实现的东西?

2 个答案:

答案 0 :(得分:9)

如果NSArray已经有一个内置的方法,我不建议实现你自己的排序,它很可能比你想出的任何东西排序更快。你可以使用它:

NSArray *sortedArray = [arrayToDoWorkOn sortedArrayWithComparator:^(id firstObject, id secondObject) {
    /* comparison code (e.g. return [[firstObject title] compareTo:[secondObject title]], or something) */
}];

现在,如果你需要在排序过程中使用这些对象,那么你就是一个泡菜,但是我建议你选择比冒泡排序更有效的排序(快速排序非常好)。


除此之外,我觉得你对GCD有点困惑。编写和使用块本身并不是用GCD执行的;必须手动完成(严格来说,块只是代码行的集合,并不固有地与GCD有关; GCD只是使用块来执行)。 NSArray的{​​{1}}方法很可能不使用GCD来枚举数组(至少参考文献没有对此进行深入了解,所以请证明我错了),如果确实如此,那不是因为你正在为它提供一个块,而是因为这就是Apple选择实现它的方式。大多数采用块的方法都不使用GCD来执行它们。

我建议您阅读Grand Central Dispatch (GCD) Reference以及Cocoa Samurai A Guide to Blocks and GCD,以便更深入地了解该主题的具体细节。

答案 1 :(得分:0)

This帖子可以帮助您或其他有类似问题的人。

相关问题