Нужно отсортировать 3 массива по одному массиву ключей - PullRequest
0 голосов
/ 30 мая 2010

Я пытаюсь получить 3 массива, отсортированных по одному массиву ключей в цели c для iphone, вот пример, чтобы помочь ...

Array 1      Array 2      Array 3     Array 4
1            15           21          7
3            12           8           9
6            7            8           0 
2            3            4           8

Когда отсортировано, я хочу, чтобы это выглядело как

Array 1      Array 2      Array 3     Array 4
1            15           21          7
2            3            4           8
3            12           8           9
6            7            8           0 

Таким образом, массив 2,3,4 перемещается с массивом 1 при сортировке.

В настоящее время я использую пузырьковую сортировку для этого, но он отстает настолько сильно, что приложение вылетает. Код, который я использую, чтобы сделать это

int flag = 0;
int i = 0;
int temp = 0;
do 
{
    flag=1;
    for(i = 0; i < distancenumber; i++)
    {
        if(distance[i] > distance[i+1])
        {
            temp = distance[i];
            distance[i]=distance[i + 1];
            distance[i + 1]=temp;

            temp = FlowerarrayNumber[i];
            FlowerarrayNumber[i] = FlowerarrayNumber[i+1];
            FlowerarrayNumber[i + 1] = temp;

            temp = BeearrayNumber[i];
            BeearrayNumber[i] = BeearrayNumber[i + 1];
            BeearrayNumber[i + 1] = temp;
            flag=0;
        }
    }

}while (flag==0);

где расстояние число - это количество элементов во всех массивах, расстояние - это массив 1 или мой ключевой массив.

, а остальные 2 сортируются.

Если кто-то может помочь мне получить сортировку слиянием (или что-то более быстрое, он работает на iPhone, поэтому он должен быть быстрым и легким), чтобы сделать это, что было бы здорово, я не могу понять, как рекурсия работает в этом методе и поэтому трудно получить код для работы. Любая помощь будет принята с благодарностью

Ответы [ 4 ]

3 голосов
/ 30 мая 2010

Разве вы не можете просто структурировать свой массив, чтобы иметь массив, в котором каждый элемент содержит массив?

Затем просто отсортируйте ваш массив на основе первого элемента массива, который он содержит, или получите простую структуру, которая содержит элемент, а также массив.

1 голос
/ 01 июня 2010

Я не могу поверить, что никто еще не предложил обернуть их в объект. Это довольно тривиально:

//MyObject.h
@interface MyObject : NSObject {
  int a;
  int b;
  int c;
  int d;
}
@property int a;
@property int b;
@property int c;
@property int d;
@end

//MyObject.m
@implementation MyObject
@synthesize a, b, c, d;
@end

//Elsewhere:

MyObject * m = [[MyObject alloc] init];
[m setA:1];
[m setB:15];
[m setC:21];
[m setD:7];

[myMutableArray addObject:m];
[m release];
//... do that for the rest of the sets of numbers

NSSortDescriptor * sortByA = [NSSortDescriptor sortDescriptorWithKey:@"a" ascending:YES];
[myMutableArray sortUsingDescriptors:[NSArray arrayWithObject:sortByA]];

Когда вы это сделаете, у вас будет один массив, но объекты в этом массиве будут отсортированы по их значению "a" в порядке возрастания.

1 голос
/ 01 июня 2010

Я просто размышляю здесь вслух, но если все ваши массивы соответствуют друг другу (то есть BeearrayNumber[x] соответствует FlowerarrayNumber[x], что соответствует distance[x]), то вы можете рассмотреть использование массива структур, а не независимых массивов. Например:

typedef struct
{
    int flowerNumber;
    int beeNumber;
    float distance;
} BeeFlowerData;

#define MAX_BEE_FLOWER_DATA (100)

BeeFlowerData allBeeFlowers[MAX_BEE_FLOWER_DATA];

Затем вы можете сортировать, используя POSIX qsort:

int BeeFlowerComparator(const void *l, const void *r)
{
    const BeeFlowerData *left = l;
    const BeeFlowerData *right = r;

    if (left->distance > right->distance)
        return 1;
    else if (left->distance < right->distance)
        return -1;
    else 
        return 0;
}


// somewhere in your class:
- (void) sort
{
    qsort (allBeeFlowers, MAX_BEE_FLOWER_DATA, sizeof(BeeFlowerData), BeeFlowerComparator);
}
0 голосов
/ 31 мая 2010

Это не объективный c конкретный вопрос. Это алгоритмический вопрос.

  1. Сначала отсортируйте первый массив.
  2. Перебрать первый массив и найти индекс для каждого числа.
  3. Затем получить значение во втором массиве, соответствующее индексу на шаге 2.
  4. создайте новый массив, содержащий результаты шага 3.
  5. Повторите шаги 2,3,4 для других массивов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...