2010-05-30 5 views
0

Je suis en train d'obtenir 3 tableaux triés par une matrice clé dans c objectif pour l'iPhone, voici un exemple pour aider ...besoin de trier 3 tableaux par une matrice clé

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

Lorsque trié Je veux que cela ressemble à

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

Les tableaux 2,3,4 se déplacent avec le tableau 1 lorsqu'ils sont triés.

Actuellement, j'utilise un tri à bulles pour le faire, mais il est si mauvais qu'il se bloque par application. Le code j'utilise pour ce faire est

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); 

où le numéro de distance est la quantité d'éléments dans tous les tableaux, la distance est un tableau 1 ou mon tableau clé.

et les 2 autres sont triés. Si quelqu'un peut m'aider à obtenir un tri de fusion (ou quelque chose de plus rapide, il fonctionne sur un iPhone, donc il doit être rapide et léger) pour faire cela, ce serait génial je ne peux pas comprendre comment la récursivité fonctionne dans ce méthode et donc avoir du mal à faire fonctionner le code. Toute aide serait grandement appréciée

+0

Quelle est la taille de vos baies? –

+0

Il n'y a rien de vraiment spécifique à Objective-C ici ... – dreamlax

+0

Ai-je manqué quelque chose, ou vous devriez être traversant seulement jusqu'à distancenumber-1 ... vous débordez le tableau sur le dernier élément – Jaime

Répondre

3

Vous ne pouvez pas simplement structurer votre tableau pour avoir un tableau que chaque élément contient un tableau?

Puis simplement trier votre tableau en fonction du premier élément du tableau qu'il contient, ou avoir une structure simple qui contient un élément et aussi le tableau.

0

Ceci n'est pas une question objective c spécifique. C'est une question algorithmique.

  1. Commencez par trier le premier tableau.
  2. Parcourez le premier tableau et recherchez l'index pour chaque numéro.
  3. Prenez ensuite la valeur dans le deuxième tableau correspondant à l'index à l'étape 2.
  4. construction d'un nouveau tableau qui contient les résultats à l'étape 3.
  5. Répétez l'étape 2,3,4 pour les autres tableaux aussi bien.
1

Je réfléchis à haute voix, mais si tous vos tableaux correspondent les uns aux autres (qui est, BeearrayNumber[x] correspond à FlowerarrayNumber[x], ce qui correspond à distance[x]), alors vous pourriez envisager d'utiliser un tableau de structures plutôt que les tableaux indépendants. Par exemple:

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

#define MAX_BEE_FLOWER_DATA (100) 

BeeFlowerData allBeeFlowers[MAX_BEE_FLOWER_DATA]; 

Ensuite, vous pouvez trier en utilisant qsort Posix:

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); 
} 
1

Je ne peux pas croire que personne n'a suggéré de les envelopper encore dans un objet. Il est assez trivial:

//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]]; 

Quand vous faites cela, vous aurez un tableau, mais les objets dans ce tableau sera trié par leur valeur « a » dans l'ordre croissant.

Questions connexes