比较NSMutableArray元素以查找列表中的第二大元素

时间:2017-01-29 13:09:39

标签: ios objective-c iphone nsarray

我正在尝试找到数组中的第二大数字。为什么这段代码不起作用?

NSMutableArray *array1=[[NSMutableArray alloc]initWithObjects:@5,@25,@48,@2,@52,@53, nil];
id temp,larg2;int k=0;    

while(k<2)
{

    for(int j=0;j<5-k;j++)
    {

          if( [array1 objectAtIndex:j]>[array1 objectAtIndex:j+1])
        {
            temp=[array1 objectAtIndex:j];
            [array1 replaceObjectAtIndex:j withObject:[array1 objectAtIndex:j+1]];
            [array1 replaceObjectAtIndex:j+1 withObject:temp];
        if(k==1  && j==3). //this statement is not running??
        { larg2=temp;
            NSLog(@"The answer is %@",larg2);
        }
        }
    }
    k++;

}

   NSLog(@"The value of Second Largest Element is %@",larg2);

}

如何找到第二大元素?

3 个答案:

答案 0 :(得分:3)

如果您需要的只是第二大项目,则无需对数组进行排序,并且您使用的排序算法非常差(它具有O(n ^ 2)性能,这意味着它将获得对于项目数量的平方来说,速度较慢,因此只需要几百个项目就会花费很长时间才能完成,并且只需几千个项目就会挂起。)

因此,尝试调试代码没有任何意义。它将口红放在猪身上&#34;正如表达式那样。

不是对数组进行排序,而是对数组进行单次传递。设置变量largestsecondLargest。如果当前数组条目大于最大值,请检查largest是否大于secondLargest,并替换secondLargest,然后将largest替换为新的最大值。这将为您提供O(n)性能(完成时间与数组中的项目数呈线性关系),这比最快排序算法更快,并且实现起来也更加简单。

如果您不关心性能,只需使用系统排序方法,然后选择排序数组中的倒数第二项。系统的排序功能经过优化,通常具有O(n log n)性能,这对排序算法非常有用。

答案 1 :(得分:2)

首先创建一个NSSet,如果你需要排除重复项,那么对数组进行降序排序,选择第二个元素。

NSArray  * unsortedArray = @[@22,@11,@53,@15,@7,@37,@11,@92,@84,@5];
NSSet *numberSet = [NSSet setWithArray: unsortedArray];
NSArray *sortedNumbers = [[numberSet allObjects] sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO] ]];
NSNumber *secondHighest;
if ([sortedNumbers count] > 1){
        secondHighest = sortedNumbers[1];
    }
NSLog(@"%ld", secondHighest);

没有排序:

NSInteger max1 = -1, max2 = -1;
for (NSInteger i = 1; i < [unsortedArray count]; ++i) {
      if ([unsortedArray[i] integerValue] > max1) {
          max2 = max1;
          max1 = [unsortedArray[i] integerValue];
       } else if ([unsortedArray[i] integerValue] > max2 && [unsortedArra1y[i] integerValue] < max1) {
            max2 = [unsortedArray[i] integerValue];
       }
    }
NSLog(@"%ld %ld",max1, max2);

如果您有一小组数组,那么您可以使用排序方法对数组进行排序,但对于大量元素,数据增加需要更多时间,性能非常差O(n ^ 2)和第二种方法很简单,表现为O(n)。

答案 2 :(得分:1)

试试这个

{{1}}