Objective-C快速计数气泡排序
我试图将一些GCD集成到我的代码中,发现一个严重的瓶颈是我在一个大数组中的对象之间执行的冒泡比较。以下是原始代码:Objective-C快速计数气泡排序,objective-c,objective-c-blocks,fast-enumeration,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:[arrayToDoW
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块实现的东西?如果
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
的EnumerateObjectsSusingBlock:
方法很可能不使用GCD来枚举数组(至少参考文献没有给出这方面的细节,所以请证明我是错的),如果是这样的话,那不是因为你给它提供了一个块,而是因为苹果选择了用GCD来实现它。大多数获取块的方法不使用GCD来执行它们
我建议您阅读《可可武士》和《可可武士》以更深入地了解该主题的细节。
-EnumerateObjectsSusingBlock:
完全没有理由使用GCD。使用GCD的变量是-EnumerateObjectsWithoOptions:usingBlock:
,并指定了NSEnumerationConcurrent
选项;我就是这么想的。啊,似乎我误读了/误解了我正在研究的一些GCD内容(对GCD来说还是很新的)。谢谢你的洞察力。在长时间地关注这个问题(并且对GCD有了更多的了解)之后,我相信我已经得出结论,我想要的东西可以通过模块来实现。谢谢这与只使用GCD的块无关。嘿,Grimless,如果我的回答回答了你的问题,别忘了将其标记为正确答案!;)哎呀。我可以发誓我已经这么做了。昨天很忙。再次感谢。
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
[obj aMessage:stuff];
}];
NSArray *sortedArray = [arrayToDoWorkOn sortedArrayWithComparator:^(id firstObject, id secondObject) {
/* comparison code (e.g. return [[firstObject title] compareTo:[secondObject title]], or something) */
}];