Objective-C Быстрая Перечисление Bubble Sort - PullRequest
2 голосов
/ 09 февраля 2011

Я пытаюсь интегрировать некоторые 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];
}];

Есть ли способ преобразовать мою вещь "смотреть вперед-сортировка-пузырь-сортировка-алгоритм" в нечто, что я могу передать в реализацию блока GCD?

Ответы [ 2 ]

9 голосов
/ 09 февраля 2011

Я бы не рекомендовал реализовывать вашу собственную сортировку, если 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 enumerateObjectsUsingBlock:, скорее всего, не использует GCD для перечисления массива (по крайней мере, ссылка не дает представления об этом, поэтому, пожалуйста, докажите, что я не прав), и если это так, то это не потому, что вы его предоставляете с блоком, а скорее потому, что именно так Apple решила его реализовать. Большинство методов, принимающих блоки, не используют GCD для их выполнения.

Я рекомендую вам прочитать Справочник Grand Central Dispatch (GCD) , а также Руководство по блокам и GCD Самурая Какао, чтобы лучше понять специфику данной темы.

0 голосов
/ 10 февраля 2011

Этот пост может помочь вам или кому-то еще с похожим вопросом.

...