arrays - Swift:使用备用键的合并排序算法

标签 arrays swift algorithm sorting mergesort

我有一个具有以下属性的对象:名称、相关性、时间戳。

我希望数组中的对象按最相关(“相关性”)和最近(“时间戳”)交错排序。

例如:相关、最近、相关、最近等...

现在,我有一个基于单个键进行排序的解决方案,时间复杂度为 O(n log n)。

这是我在 Swift 中的解决方案:

func mergeSort(array: [Entity]) -> [Entity] {
    guard array.count > 1 else { return array }    // 1

    let middleIndex = array.count / 2              // 2

    let leftArray = mergeSort(Array(array[0..<middleIndex]))             // 3

    let rightArray = mergeSort(Array(array[middleIndex..<array.count]))  // 4

    return merge(leftPile: leftArray, rightPile: rightArray)             // 5
}


    func merge(leftPile leftPile: [Entity], rightPile: [Entity]) -> [Entity] {
    // 1
    var leftIndex = 0
    var rightIndex = 0

    // 2
    var orderedPile = [Entity]()

    // 3
    while leftIndex < leftPile.count && rightIndex < rightPile.count {
            if leftPile[leftIndex].timestamp.isGreaterThanDate(rightPile[rightIndex].timestamp) {
                orderedPile.append(leftPile[leftIndex])
                leftIndex += 1
            } else if leftPile[leftIndex].timestamp.isLessThanDate(rightPile[rightIndex].timestamp) {
                orderedPile.append(rightPile[rightIndex])
                rightIndex += 1
            }
            else{
                orderedPile.append(leftPile[leftIndex])
                leftIndex += 1
                orderedPile.append(rightPile[rightIndex])
                rightIndex += 1
            }
    }

    // 4
    while leftIndex < leftPile.count {
        orderedPile.append(leftPile[leftIndex])
        leftIndex += 1
    }

    while rightIndex < rightPile.count {
        orderedPile.append(rightPile[rightIndex])
        rightIndex += 1
    }

    return orderedPile
}

代码完美地对“最近”数组进行排序,我还可以将键从“时间戳”更改为“相关性”,以将其排序为“最相关”。

但是,我想要如上所述以最短的复杂度进行交错排序。有没有人有好的解决办法?

最佳答案

按相关性排序。

制作一份按最近程度排序的副本。

以交替顺序合并副本,保留合并中副本的字典,并且不再添加它们。

两种排序的时间复杂度为O(n log(n)),合并的时间复杂度为O(n)O(n log(n)).

关于arrays - Swift:使用备用键的合并排序算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36228804/

相关文章:

javascript - 比较两个对象数组并将具有匹配值的对象添加到第一个对象数组

swift - 如何在函数中设置静态变量的属性

ios - 在 UIViewController 中关闭键盘

javascript - 使用嵌套在两个键内的 JSON 代码创建一个数组

jQuery 获取单击元素的宽度存储在变量中

ios - 可重用 TableViewCell 中的辅助功能问题

ruby - 形式参数不能是全局变量

algorithm - 最小操作数

algorithm - 预处理静态数据结构的大 O 表示法

arrays - 将引号中的数组转换为数组