2012-07-17 73 views
2

我想在下面顯示的代碼中使用Objective-C對15個隨機數進行排序。代碼沒有按計劃運行。我從插入排序C代碼中瞭解了這個概念。 15個隨機數正在生成,但排序不起作用。Objective-C中的插入排序算法在iphone中實現

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

有沒有特別的原因讓你自己編寫排序,而不是在'NSArray'上使用'sortedArrayUsing ...'方法之一?除非這是一項嚴格的要求,例如作業分配,否則很少有理由實施自己的分類。 – DPlusV 2012-07-17 10:10:19

+0

謝謝,是的,我需要使用上面的代碼進行排序,而不是內部功能,看看需要多少時間才能執行某些算法 – 2012-07-17 10:13:31

+0

不成熟的優化或研究的樂趣/教育?無論如何,只有15個數字你不會得到任何可靠的數據(或性能問題)。 – 2012-07-17 11:36:02

回答

3

你是比較指針,這只是你的對象的內存地址排序的數組,而不是他們的實際價值。

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

運行代碼並查看結果。