【问题标题】:Objective-C Fast Enumeration Bubble SortObjective-C 快速枚举冒泡排序
【发布时间】:2011-02-09 01:22:38
【问题描述】:

我正在尝试将一些 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];
}];

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

【问题讨论】:

  • 这与仅 GCD 块无关。
  • 嘿Grimless,如果我的回答回答了你的问题,别忘了标记为正确答案! ;)
  • 哎呀。我可以发誓我已经这样做了。昨天很忙。再次感谢。

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


【解决方案1】:

如果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 只是使用块来执行)。 NSArrayenumerateObjectsUsingBlock: 方法很可能不使用 GCD 来枚举数组(至少参考资料对此没有任何见解,所以请证明我错了),如果是这样,那不是因为您提供了它有一个块,而是因为这就是Apple选择实现它的方式。大多数获取块的方法不使用 GCD 来执行它们。

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

【讨论】:

  • -enumerateObjectsUsingBlock: 完全没有理由使用 GCD。使用 GCD 的变体是 -enumerateObjectsWithOptions:usingBlock: 并指定了 NSEnumerationConcurrent 选项。
  • 我们去吧;我就是这么想的。
  • 啊,我似乎误读/误解了我正在研究的一些 GCD 内容(对 GCD 来说还是很新的东西)。感谢您的洞察力。在盯着这个问题看了一段时间之后(并且对 GCD 有了更多的了解),我相信我已经得出结论,我想要的可以通过块来实现。谢谢!
猜你喜欢
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
  • 2023-03-03
  • 2017-03-18
  • 1970-01-01
相关资源
最近更新 更多