我正在與Objective-C,但可能它並不重要的編程語言。所以基本上我有一個數組,有整數12,5和17,我希望能夠拉出最大的數,或者最小的,或者第二小的數等等。訂單整數在升序和降序
基本上我想能夠將它們分類爲升序或降序,以便我可以通過檢索objectAtIndex: 1
(如果升序排序)挑選出次數最少的數字。我覺得這非常明顯,但我現在無法想到如何去做,所以如果有人能夠啓發我,我會喜歡它。
我正在與Objective-C,但可能它並不重要的編程語言。所以基本上我有一個數組,有整數12,5和17,我希望能夠拉出最大的數,或者最小的,或者第二小的數等等。訂單整數在升序和降序
基本上我想能夠將它們分類爲升序或降序,以便我可以通過檢索objectAtIndex: 1
(如果升序排序)挑選出次數最少的數字。我覺得這非常明顯,但我現在無法想到如何去做,所以如果有人能夠啓發我,我會喜歡它。
如果你有一個NSArray
與NSNumber
情況下,那麼你正在尋找的排序是因爲這很容易:
NSArray* sortedNumbers = [unorderedNumbers sortedArrayUsingSelector:@selector(intValue)];
它將升序排序,所以[sortedNumbers lastObject]
將是最大的價值。
NSArray
有更多的排序方法,如果你有更多的具體需求。 NSArray sorting
只需按升序排序數組(我不使用目標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)都有庫來對數組進行排序。但正如你所說的那樣,語言無關緊要,可能你正在尋找算法本身。有許多排序算法具有不同的計算複雜度。你可以在任何標準算法書中找到它們。或者這兩個頁面可能對您有幫助:
如果您對objective-c特別感興趣,請檢查Sorting section of NSArray reference。這包含一個排序整數數組的例子。
如果你的目標是得到最高的數字,或者最低的,或者第二低的,或者你有什麼,並且你只需要結果中的一個數字,那麼排序是矯枉過正的。相反,您應該遍歷整個數組,並跟蹤迄今爲止所見到的最高(或最低,或最低的2位)數。如果你的語言支持這個,它將被稱爲「摺疊」。實際對數組進行排序的唯一原因是如果您需要訪問數組中的多個不同的排序值。
我試過你發佈的代碼,它根本沒有工作。沒有任何語法錯誤或警告,但沒有發生任何事情,順序保持不變,所以我不知道這是怎麼回事。 – Regan 2010-10-24 18:51:16
@Regan:請注意'sortedArrayUsingSelector:'不能排序。它返回一個帶有排序值的新數組,原始數組保持不變。 – PeyloW 2010-10-25 13:00:36
是的,我知道,我複製了你的確切代碼,但我最終用這裏描述的方法去反正:http://stackoverflow.com/questions/1844031/how-to-sort-nsmutablearray-using-sortedarrayusingdescriptors – Regan 2010-10-26 01:12:47