当前位置: 首页 > 面试题库 >

如何在Swift的排序数组中正确位置插入元素?

芮歌者
2023-03-14
问题内容

NSArray必须- (NSUInteger)indexOfObject:(id)obj inSortedRange:(NSRange)r options:(NSBinarySearchingOptions)opts usingComparator:(NSComparator)cmp确定新对象在排序数组中的插入位置。

在纯Swift中,最好的高性能方法是什么?

类似于以下内容:

var myArray = ["b", "e", "d", "a"]
myArray.sort { $0 < $1 }

// myArray is now [a, b, d, e]

myArray.append("c")
myArray.sort { $0 < $1 }

// myArray is now [a, b, c, d, e]

我想找出正确的位置并插入元素,而不是追加新元素然后对数组进行排序:

let index = [... how to calculate this index ??? ...]
myArray.insert("c", atIndex: index)

问题答案:

这是在Swift中使用二进制搜索的一种可能的实现方式(来自
http://rosettacode.org/wiki/Binary_search#Swift并进行了一些修改):

extension Array {
    func insertionIndexOf(_ elem: Element, isOrderedBefore: (Element, Element) -> Bool) -> Int {
        var lo = 0
        var hi = self.count - 1
        while lo <= hi {
            let mid = (lo + hi)/2
            if isOrderedBefore(self[mid], elem) {
                lo = mid + 1
            } else if isOrderedBefore(elem, self[mid]) {
                hi = mid - 1
            } else {
                return mid // found at position mid
            }
        }
        return lo // not found, would be inserted at position lo
    }
}

如同indexOfObject:inSortedRange:options:usingComparator:假定数组是相对于比较器排序的。如果该元素已经存在于数组中,则它返回该元素的(任何)索引,或者返回保留该顺序时可以在其中插入的索引。这对应于NSBinarySearchingInsertionIndexNSArray方法的。

用法:

let newElement = "c"
let index = myArray.insertionIndexOf(newElement) { $0 < $1 } // Or: myArray.indexOf(c, <)
myArray.insert(newElement, at: index)


 类似资料:
  • 问题内容: 假设我们有两个数组: 现在,我想在每个数组的第三个元素之后插入。我该怎么做? 问题答案: 可以用来提取数组的部分,联合数组运算符()可以重新组合部分。 这个例子: 给出:

  • 问题内容: 尝试从我知道仅包含整数的数组中获取最高和最低值似乎比我想象的要难。 我希望这能显示出来。相反,它显示。因此,似乎排序是将值作为字符串处理。 有没有一种方法可以使sort函数对整数值进行实际排序? 问题答案: 默认情况下,sort方法按字母顺序对元素进行排序。要进行数字排序,只需添加一个处理数字排序的新方法(sortNumber,如下所示)- 在ES6中,可以使用箭头功能简化此操作: 说

  • 我正在尝试自己编程气泡排序、选择排序和插入排序。但是,我在插入排序方面遇到了麻烦。我会提供我的代码以及每行在做什么 好的,所以int count是找出排序数组的起始位置。然后我声明了index以查找将元素放在排序数组之后的位置,并为未排序数组的第一个元素声明了一个临时int,如果它小于排序数组的最后一个元素。然后它反转数组直到第一个元素,如果它大于我要添加的元素,则为其索引分配索引。本质上是为了让

  • 问题内容: 我想要这段代码的Swift版本: 问题答案: 更新:根据其他SO用户的建议提供解释。 与ObjC不同,在Swift中,您有sorted()(和sort())方法,该方法采用您提供的闭包,该闭包返回一个布尔值,以指示一个元素应该在另一个元素之前(true)还是在(false)之后。$ 0和$ 1是要比较的元素。我使用localizedCaseInsensitiveCompare来获得您想

  • 我正试图按排序的顺序将一个元素添加到数组中。 5、6、7、9、11、0

  • 我需要使用递归完成以下任务: 声明一个函数insert\u all\u positions(插入所有位置),该函数接受以下参数:一个元素x和一个数组arr。函数必须返回一个数组数组,每个数组对应于arr,其中x插入到可能的位置。也就是说,如果arr是长度N,则结果是具有N 1个数组的数组。 例如,插入所有位置(10、[1,2,3])的结果是数组: 到目前为止,我有这个代码: