Как мне отсортировать массив целых чисел в cocoa?

#arrays #cocoa

#массивы #какао

Вопрос:

Я новичок в программировании на Mac (т.Е. xcode и cocoa), и я пытаюсь просто выполнить пузырьковую сортировку, и у меня возникают большие трудности с этим.

Цель этого — отфильтровать изображение с помощью медианного фильтра с использованием ядра 9 пикселей. Я беру значения шкалы серого для всех девяти пикселей, а затем пытаюсь поместить их в массив из девяти точек и отсортировать массив, чтобы извлечь среднее значение из девяти (поэтому не имеет значения, использую ли я возрастание или убывание).

Я пытался сохранить значения пикселей (которые являются целыми числами) в a NSMutableArray , но я действительно понятия не имею, как это сделать или как затем отсортировать их, когда массив заполнен.

     // Perform median filter on all images in the stack 
    for (x = 0; x < [curPix pwidth]; x  ){
        for (y = 0; y < [curPix pheight]; y  ){

            float value;
            int tLeft, tMid, tRight, cLeft, index, cRight, bLeft, bMid, bRight; // takes in pixel placement
            value = tLeft = tMid = tRight = cLeft = index = cRight = bLeft = bMid = bRight = 0;
            curPos = y * [curPix pwidth]   x;

            if (x != 0 amp;amp; y != 0 amp;amp; x != ([curPix pwidth]-1) amp;amp; y != ([curPix pheight]-1)){

                //Make kernel for median filter
                index   = fImage[curPos];                       // index pixel
                tLeft   = fImage[index - [curPix pwidth] - 1];  // top left
                tMid    = fImage[index - [curPix pwidth]];      // top middle
                tRight  = fImage[index - [curPix pwidth]   1];  // top right
                cLeft   = fImage[index - 1];                    // center left
                cRight  = fImage[index   1];                    // center right
                bLeft   = fImage[index   [curPix pwidth] - 1];  // bottom left
                bMid    = fImage[index   [curPix pwidth]];      // bottom middle
                bRight  = fImage[index   [curPix pwidth]   1];  // bottom right

                // Need to make array, populate with pixels (above), and sort.
                // Once sorted, take median value, save it as 'value', and store it as new pixel value

                fImage[curPos] = (int) value;   // return value to index
            }
            else {
                fImage[curPos] = fImage[curPos];                
            }
        }
    }
  

Ответ №1:

Как мне отсортировать массив целых чисел в cocoa?

int это тип C, так же, как и в C.

Mac OS X поставляется с рядом функций сортировки в стандартной библиотеке. qsort , которая является быстрой сортировкой, определяется C; остальные, я думаю, из BSD. Все они находятся на странице руководства qsort.

Каждая из функций принимает массив элементов размером с указатель, поэтому вы захотите использовать long (или, для большей переносимости, intptr_t ), а не int для элементов.

Создайте массив C из таких элементов, заполните его вручную, затем выполните сортировку с помощью одной из этих функций и найдите медиану.

Ответ №2:

Чтобы заполнить их в an NS(Mutable)Array , вам нужно обернуть ваши int s в экземпляры NSNumber , например:

 NSMutableArray *myArray = [NSMutableArray array];
[myArray addObject:[NSNumber numberWithInt:42]];
  

Для начала существуют различные методы сортировки результирующего массива:

 [myArray sortUsingSelector:@selector(compare:)];
  

К счастью, здесь не используется BubbleSort.

Ответ №3:

Для начала я бы воздержался от сортировки пузырьками, если вы не сортируете небольшую выборку. Сортировка пузырьками происходит очень медленно. Не будучи экспертом по какао, я не могу вам ничем помочь, кроме как предложить вам изучить встроенные процедуры сортировки массива.

Это для iphone, но может помочь: http://www.iphonedevsdk.com/forum/iphone-sdk-development/61615-how-do-i-sort-30-000-objects.html

Удачи.

Комментарии:

1. Это для сортировки объектов Cocoa, а не int s.