0
I am sorting a array of string numbers using ios inbuilt sorting method but it is giving me wrong output.So I applied bubble sorting for a while,Any body can explaing why it is behaving like that.So that I can optimize my code.

NSArray *numbers=@[@"45",@"2",@"11",@"31",@"240",@"310"];
numbers=[numbers sortedArrayUsingSelector:@selector(compare:)];

NSLog(@"sorted array is %@",numbers);

NSMutableArray *m_Array=[[NSMutableArray alloc] initWithArray:numbers];

[numbers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    for (int j=idx+1; j<numbers.count; j++) {

        if ([m_Array[idx] intValue]>[m_Array[j] intValue]) {
            NSString *temp=m_Array[idx];
            [m_Array replaceObjectAtIndex:idx withObject:m_Array[j]];
            [m_Array replaceObjectAtIndex:j withObject:temp];
        }
    }
}];

NSLog(@"sorted array after bubble sort is %@",m_Array);

输出是

排序后的数组是 ( 11, 2, 240, 31, 310, 45 )

冒泡排序后的排序数组为 ( 2, 11, 31, 45, 240, 310 )

4

3 回答 3

3

那是因为您正在比较字符串对象,而不是数字。

尝试将您的数组更改为数字而不是字符串(在引号中)。

换句话说,而不是

NSArray *numbers=@[@"45",@"2",@"11",@"31",@"240",@"310"];

你做:

NSArray *numbers=@{@45,@2,@11,@31,@240,@310};

(它们是 Objective-C 文字,如本文档中所述),您会看到更好的结果。

“冒泡排序”方法对您更有效的原因是您intValue在该数组中获得了字符串对象的“”。第一个算法不会发生这种情况。

于 2013-06-03T12:37:40.057 回答
1

使用 NSNumber 而不是使用字符串将整数值添加到数组中。

 NSMutableArray *array =[NSMutableArray alloc]initWithObjects:[NSNumber      numberWithInteger:12],[[NSNumber numberWithInteger:122] ];

然后排序

[array sortedArrayUsingSelector:@selector(compare:)]
于 2013-06-03T12:48:14.160 回答
0

这是因为在 Objective-C 中排序按第一个元素排序数据,如果第一个元素相同,则查找下一个元素,否则根据第一个元素值排序。假设 11 和 2 的情况,因为它检查2 的第一个元素和第一个元素大于 11 的第一个元素(即 1)。因此它会将 2 声明为更大以进行排序。而 2 将出现在 11 之后。

对于排序,您必须保留数字的前缀值才能正确排序。例如:001,002,003 表示 3 位数字,01,02,03 表示两位数字。

NSMutableArray *tempArray=[[NSMutableArray alloc] initWithCapacity:[numbers count]];
[numbers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [tempArray addObject:[NSString stringWithFormat:@"%03d",[numbers[idx] intValue]]];
}];

NSLog(@"sorted array is %@",[tempArray sortedArrayUsingSelector:@selector(compare:)]);

注意: ---仅适用于可变数字大小,--- 计算数组中的最大编号并以编程方式计算其数字并相应地设置字符串格式。

于 2013-06-03T12:38:21.450 回答