订单整数在升序和降序

订单整数在升序和降序

问题描述:

我正在与Objective-C,但可能它并不重要的编程语言。所以基本上我有一个数组,有整数12,5和17,我希望能够拉出最大的数,或者最小的,或者第二小的数等等。订单整数在升序和降序

基本上我想能够将它们分类为升序或降序,以便我可以通过检索objectAtIndex: 1(如果升序排序)挑选出次数最少的数字。我觉得这非常明显,但我现在无法想到如何去做,所以如果有人能够启发我,我会喜欢它。

如果你有一个NSArrayNSNumber情况下,那么你正在寻找的排序是因为这很容易:

NSArray* sortedNumbers = [unorderedNumbers sortedArrayUsingSelector:@selector(intValue)]; 

它将升序排序,所以[sortedNumbers lastObject]将是最大的价值。

NSArray有更多的排序方法,如果你有更多的具体需求。 NSArray sorting

+0

我试过你发布的代码,它根本没有工作。没有任何语法错误或警告,但没有发生任何事情,顺序保持不变,所以我不知道这是怎么回事。 – Regan 2010-10-24 18:51:16

+0

@Regan:请注意'sortedArrayUsingSelector:'不能排序。它返回一个带有排序值的新数组,原始数组保持不变。 – PeyloW 2010-10-25 13:00:36

+0

是的,我知道,我复制了你的确切代码,但我最终用这里描述的方法去反正:http://*.com/questions/1844031/how-to-sort-nsmutablearray-using-sortedarrayusingdescriptors – Regan 2010-10-26 01:12:47

只需按升序排序数组(我不使用目标C,但我相信有一个函数为它),然后拿到元素,无论你想...

要获得最大的

array[array.length - 1] 

第二大

array[array.length -2] 

最小

array[0] 

第二小

array[1] 

您应该检查以确保数组索引是有效的:

if (array.length - 2> 0) //Second largest element 

    return array[array.length - 2]; 

或者:

if (array.length > 1) //Second smallest element 

    return array[1]; 

看到这里如何排序的数组目标C:

http://howtomakeiphoneapps.com/2009/03/how-to-sort-an-array-in-objective-c/

如果要保留原始数组的顺序,一种方法是创建第二个数组,其中只包含数字0,1,... n,表示第一个数组中的索引。然后对第二个数组进行排序,但不是比较其值,而是比较它指向第一个数组的相应值。 (你可以根据解除引用的指针也只是存储指针和排序。)

然后找出第二大数目,查找该指数在第二到最后一个位置的第二阵列,看看它指向到第一个数组中。

如果你想得到花哨和避免排序,this lecture描述了一个算法,用于在线性时间内找到k最大的元素。我没有真正使用它,但是如果数据经常变化,它看起来可能是一个好方法,因为您不必维护额外的数组。

几乎每个高级语言(包括objective-c)都有库来对数组进行排序。但正如你所说的那样,语言无关紧要,可能你正在寻找算法本身。有许多排序算法具有不同的计算复杂度。你可以在任何标准算法书中找到它们。或者这两个页面可能对您有帮助:

  1. Sorting Algorithms in Wikipedia
  2. sorting-algorithms.com。包含动画的很好的解释。

如果您对objective-c特别感兴趣,请检查Sorting section of NSArray reference。这包含一个排序整数数组的例子。

如果你的目标是得到最高的数字,或者最低的,或者第二低的,或者你有什么,并且你只需要结果中的一个数字,那么排序是矫枉过正的。相反,您应该遍历整个数组,并跟踪迄今为止所见到的最高(或最低,或最低的2位)数。如果你的语言支持这个,它将被称为“折叠”。实际对数组进行排序的唯一原因是如果您需要访问数组中的多个不同的排序值。