在Objective-c中是否有任何内置的排序方法?

时间:2012-06-11 13:40:07

标签: objective-c cocoa-touch sorting

我有两个已排序 NSMutableArrays(或者我可以使用任何其他集合,而不是关键),我需要将第一个数组中的对象插入第二个数组并保留排序顺序第二阵列。这样做的最佳(最快)方法是什么?我可以实现所有已知的好算法,但我的问题是,如果已经有一些内置方法?如果没有,我的情况下最好的算法是什么?

5 个答案:

答案 0 :(得分:3)

真正的答案是:取决于,因为您要问:在保留排序顺序的同时,将对象从一个数组插入另一个数组的最快方法是什么。


在排序数组的正确位置没有内置插入方式。只需将两个数组加在一起就可以达到同样的效果,但它不是“最快的方法”。

实际上更快取决于很多事情,例如:数组包含多少数据,数组 1 与数组 2 中的数据比例(一个数组包含的数据远远多于其他数据?等等。

注意:您应该从简单的解决方案开始,只有在遇到性能问题时才进行优化。使用大型数据集进行测量,以确定您的解决方案适用于您的用户可能拥有的任何数据。

将一个已排序数组中的项插入另一个已排序数组

如果要通过在正确的位置插入对象来合并两个数组,则应用常规算法。您应该将较小的数组插入较大的数组中,并尝试尽可能地插入整个排序的序列,而不是逐个插入每个项目。

为获得最佳性能,您应尝试使用insertObjects:atIndexes:进行批量插入,而不是逐个插入对象。

如果为选项指定indexOfObject:inSortedRange:options:usingComparator:,则可以使用NSBinarySearchingInsertionIndex查找每个项目应插入另一个数组的索引。此外,您使用的比较器必须与排序数组的比较器相同,否则结果为“未定义”。

考虑到这一点,你会做这样的事情

Create mutable index
For every ITEM in SMALLER ARRAY
    Find the index where to insert ITEM in LONGER ARRAY
    Add (the insertion location + the location in the short array) as the index in the mutable set.
Next item.

Batch insert all items.

The documentation for insertObjects:atIndexes:告诉您“先前插入后在索引中指定的相应位置。”在您的情况下使用两个排序数组意味着所有具有较低索引的项目已经添加,因此您应该将short数组中对象的索引添加到从indexOfObject:inSortedRange:options:usingComparator:返回的值。

你可以做的另一个(可能非常过早的优化)是减少循环中每个项目的sortedRange,这样你就不必搜索你知道要插入的项目大于的数组部分。 / p>

可能还有许多其他优化措施。你应该先测量一下!希望这会让你开始。

答案 1 :(得分:2)

NSArray *newArray=[firstArray arrayByAddingObjectsFromArray:secondArray];
newArray = [newArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

答案 2 :(得分:2)

我首先简单地将第一个数组的所有对象添加到第二个数组,然后使用第二个数组。时间需要多长时间。如果可以接受,请停在那里。

如果没有,您可以尝试binary search在第二个数组中为第一个数组中的每个项找到插入点。由于两个数组都已排序,因此您可以通过每次使用最后一个插入点作为下限来优化搜索。像这样:

NSInteger insertionPoint = -1;
for (id object in array1)
{
    insertionPoint = [self binarySearch: array2 for: object lowerBound: insertionPoint + 1];
    [array2 insertObject: object atIndex: insertionPoint];
}

答案 3 :(得分:1)

来自NSSortDescriptor的Cocoa类sortedArrayUsingDescriptors:NSArray应该可以完成您的工作。

由于您使用的是可变数组,因此您可能希望使用sortUsingDescriptors:对可变数组进行排序而不创建新数组。

答案 4 :(得分:0)

查看此处的文档,了解是否有任何NSArray排序方法适合您。 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html。您可以向下滚动到方法,并有7个内置的方法进行排序。您可以只组合两个数组并运行sortedArrayUsingComparator:或其他方法之一。