3

以下に示すコードで、Objective-C を使用して 15 個の乱数をソートしようとしています。コードが計画どおりに機能していません。挿入ソートの C コードから概念を取り入れました。15 個の乱数は正しく生成されていますが、並べ替えは機能していません。

C コード:

int i, j, index;
for (i = 1; i < array_size; ++i)
{
  index = a[i];
  for (j = i; j > 0 && a[j-1] > index; j--)
    a[j] = a[j-1];

  a[j] = index;
}

Objective-C コード:

-(IBAction)clicked_insertsort:(id)sender
{
  NSMutableArray *array = [NSMutableArray array];
  for (int x = 0; x < 15; x++) 
  {
    [array addObject: [NSNumber numberWithInt: arc4random()%200]];
  }
  NSLog(@"%@",array);
  {
    int i, j;
    id index;
    for (i = 1; i < 15; ++i)
    {
      index = [array objectAtIndex:(NSUInteger)i]; //   a[i];
      for (j = i; j > 0 && [array objectAtIndex:(NSUInteger)j-1] > index; j--)
        [array replaceObjectAtIndex: (j) withObject: [array objectAtIndex: (j-1)]];

      [array objectAtIndex:(NSUInteger)j] == index ;
    }
  }
  NSLog(@"%@",array);   
}
4

2 に答える 2

4

ポインターを比較しています。これは、実際の値ではなく、オブジェクトのメモリ アドレスで配列を並べ替えるだけです。

index = [array objectAtIndex:(NSUInteger)i]; //   a[i];
[array objectAtIndex:(NSUInteger)j-1] > index

NSNumber のプリミティブ整数値を取得する必要があります。

[NSNumber numberWithInt:20] != 20; // This is wrong.
[[NSNumber numberWithInt:20] intValue] == 20; // This is correct.

リビジョンを含むコードは次のとおりです。

-(IBAction)clicked_insertsort:(id)sender
{
  NSMutableArray *array = [NSMutableArray array];
  for (int x = 0; x < 15; x++) 
  {
    [array addObject: [NSNumber numberWithInt: arc4random()%200]];
  }
  NSLog(@"%@",array);
  {
    int i, j;
    id index;
    for (i = 1; i < 15; ++i)
    {
      index = [[array objectAtIndex:(NSUInteger)i] intValue]; //   a[i];
      for (j = i; j > 0 && [[array objectAtIndex:(NSUInteger)j-1] intValue] > index; j--)
        [array replaceObjectAtIndex: (j) withObject: [array objectAtIndex: (j-1)]];

      [[array objectAtIndex:(NSUInteger)j] intValue] == index ;
    }
  }
  NSLog(@"%@",array);   
}
于 2012-07-17T12:22:32.300 に答える
0

実際の問題は、アルゴリズム自体があまり意味をなさないことです。

この行:

[array objectAtIndex:(NSUInteger)j] == index ;

次のようにする必要があります。

[array replaceObjectAtIndex:j withObject:index]; //yes again

最新の構文で、この方法を試してください。

-(IBAction)clicked_insertsort:(id)sender
{
    NSMutableArray *array = [NSMutableArray array];
    for (int x = 0; x < 15; x++)
    {
        [array addObject: @(arc4random()%200)];
    }
    NSLog(@"%@",array);

    NSUInteger i, j;
    for (i = 1; i < 15; ++i)
    {
        NSNumber *current = array[i];
        for (j = i; j > 0 && [array[j-1] unsignedIntegerValue] > [current unsignedIntegerValue]; j--)
            array[j] = array[j-1];

        array[j] = current;
    }
    NSLog(@"%@",array);
}

コードを実行して結果を確認します。

于 2014-02-18T15:38:31.167 に答える