【问题标题】:Need to sort 3 arrays by one key array需要按一键数组对3个数组进行排序
【发布时间】:2010-05-30 17:38:34
【问题描述】:

我正在尝试在目标 c 中为 iphone 获取 3 个按一个键数组排序的数组,这是一个帮助示例...

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 上运行,因此它需要快速和轻便)来做到这一点,那就太好了,我无法弄清楚递归在这种方法中是如何工作的因此很难让代码正常工作。 任何帮助将不胜感激

【问题讨论】:

  • 你的阵列有多大?
  • 这里并没有什么特别针对 Objective-C...
  • 我是否遗漏了什么,或者您应该只遍历到 distancenumber-1...您在最后一项上溢出了数组
  • @dreamlax iPhone 要求隐含了 Objective-C 的特殊性(当然也可以包括 C)

标签: objective-c sorting arrays


【解决方案1】:

你不能简单地将你的数组构造成一个数组,每个项目都包含一个数组吗?

然后根据数组的第一项简单地对数组进行排序,或者使用一个简单的结构来保存一个项和数组。

【讨论】:

    【解决方案2】:

    我只是在这里大声思考,但是如果您所有的数组都相互对应(即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);
    }
    

    【讨论】:

      【解决方案3】:

      我不敢相信还没有人建议将它们包装在一个对象中。这是相当微不足道的:

      //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”值升序排序。

      【讨论】:

        【解决方案4】:

        这不是一个客观的 c 特定问题。这是一道算法题。

        1. 首先对第一个数组进行排序。
        2. 遍历第一个数组并找到每个数字的索引。
        3. 然后在第二个数组中检索与步骤 2 中的索引对应的值。
        4. 构造一个保存第 3 步结果的新数组。
        5. 对其他阵列也重复第 2、3、4 步。

        【讨论】:

          猜你喜欢
          • 2012-02-19
          • 2011-02-10
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-14
          相关资源
          最近更新 更多