2016-03-25 6 views
0

プロパティ、名前、妥当性、タイムスタンプを持つオブジェクトがあります。Swift:代替キーによるソートアルゴリズムの統合

配列内のオブジェクトを、最も関連性の高い(Relevance)と最近の(Timestamp)で並べ替えるようにします。

のような:など、関連最近、関連、最近...今

、私はOの時間計算(N Nを記録)を持つ単一のキーに基づいてソートするソリューションを持っています。

ここスウィフトの私のソリューションです:

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 
} 

コードがために、配列をソート完全に「最新」と私はまた、「ほとんどのためにそれをソートするために、「タイムスタンプ」を「妥当」からキーを変更することができます関連性がある。

しかし、上記のようにインターレースソートしたいのは、最も複雑です。誰にもこれに対する良い解決策がありますか?

答えて

0

関連度順に並べ替え

最近の順にソートしてください。

コピーを別の順序でマージし、1つの辞書をマージしておき、再度追加しないでください。

O(n log(n))の2種類があり、O(n log(n))の場合、マージはO(n)です。

関連する問題