比较 NSMutableArray 元素以从列表中找到第二大元素
Compare NSMutableArray elements to find second largest from list
我正在尝试查找数组中第二大的数字。为什么此代码不起作用?
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);
}
如何找到第二大元素?
如果您只需要第二大项,则无需对数组进行排序,并且您使用的排序算法非常差(它具有 O(n^2) 性能,这意味着它将得到项目数量的平方会变慢,因此只有几百个项目会开始需要很长时间才能完成,而几千个项目似乎会挂起。)
因此,尝试调试您的代码没有实际意义。表达式为 "putting lipstick on a pig"。
不对数组进行排序,而是单次遍历数组。设置变量 largest
和 secondLargest
。如果当前数组项大于最大值,检查largest
是否大于secondLargest
,并替换secondLargest
,然后用新的最大值替换largest
。这将为您提供 O(n) 性能(完成时间随数组中项目的数量线性增加),这比最快的排序算法更快,而且实现起来也更简单。
如果您不关心性能,只需使用系统排序方法,然后取排序数组中的倒数第二项。系统的排序函数经过优化,通常具有O(n log n)的性能,这对于排序算法来说是相当不错的。
如果需要排除重复项,先创建一个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).
试试这个
NSArray *arr = [[NSArray alloc]initWithObjects:@20,@12,@24, nil];
NSSet *tempSet = [NSSet setWithArray: arr];
NSArray *arr1 = [[tempSet allObjects] sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES] ]];
NSLog(@"%@",[arr1 objectAtIndex:1]);
我正在尝试查找数组中第二大的数字。为什么此代码不起作用?
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);
}
如何找到第二大元素?
如果您只需要第二大项,则无需对数组进行排序,并且您使用的排序算法非常差(它具有 O(n^2) 性能,这意味着它将得到项目数量的平方会变慢,因此只有几百个项目会开始需要很长时间才能完成,而几千个项目似乎会挂起。)
因此,尝试调试您的代码没有实际意义。表达式为 "putting lipstick on a pig"。
不对数组进行排序,而是单次遍历数组。设置变量 largest
和 secondLargest
。如果当前数组项大于最大值,检查largest
是否大于secondLargest
,并替换secondLargest
,然后用新的最大值替换largest
。这将为您提供 O(n) 性能(完成时间随数组中项目的数量线性增加),这比最快的排序算法更快,而且实现起来也更简单。
如果您不关心性能,只需使用系统排序方法,然后取排序数组中的倒数第二项。系统的排序函数经过优化,通常具有O(n log n)的性能,这对于排序算法来说是相当不错的。
如果需要排除重复项,先创建一个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).
试试这个
NSArray *arr = [[NSArray alloc]initWithObjects:@20,@12,@24, nil];
NSSet *tempSet = [NSSet setWithArray: arr];
NSArray *arr1 = [[tempSet allObjects] sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES] ]];
NSLog(@"%@",[arr1 objectAtIndex:1]);