Swift版全排列-Heap's Algorithm

前端之家收集整理的这篇文章主要介绍了Swift版全排列-Heap's Algorithm前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Swift 全排列算法,递归版和非递归版,都有! 参考于Wiki-Heap's algorithm

很有Swift特色,不是简单的翻译而已,废话不多说,直接上代码(Swift3+):

import Foundation

/// 递归全排列
func heapsAlgorithmPermutationRecursive<T: Collection>(list: T) -> [[T.Iterator.Element]] {
    var result: [[T.Iterator.Element]] = []
    var temp = Array(list)
    // Heap's Algorithm recursive
    func heap(n: Int) {
        if n == 1 {
            result.append(temp)
        }else {
            for i in 0..<n-1 {
                heap(n: n-1)
                swap(&temp[n%2 == 0 ? i : 0],&temp[n-1])
            }
            heap(n: n-1)
        }
    }
    // start
    heap(n: temp.count)
    return result
}

/// 非递归全排列
func heapsAlgorithmPermutationNonRecursive<T: Collection>(list: T) -> [[T.Iterator.Element]] {
    var result: [[T.Iterator.Element]] = []
    var temp = Array(list)
    var index = [Int](repeating: 0,count: temp.count)
    var i = 0
    // Heap's Algorithm non-recursive
    result.append(temp)
    while i < temp.count {
        if index[i] < i {
            swap(&temp[i%2 == 0 ? 0 : index[i]],&temp[i])
            result.append(temp)
            index[i] += 1
            i = 0
        }else {
            index[i] = 0
            i += 1
        }
    }
    return result
}


// 测试数据
//let list = Array(1...7)
var list = "abc".characters
var date = NSDate()
var result: [[Any]]

// 递归
result = heapsAlgorithmPermutationRecursive(list: list)
print("递归:\ncount:\(result.count)\n耗时:\(date.timeIntervalSinceNow)")
print(result)

// 非递归
date = NSDate()
result = heapsAlgorithmPermutationNonRecursive(list: list)
print(date.timeIntervalSinceNow)
print("非递归:\ncount:\(result.count)\n耗时:\(date.timeIntervalSinceNow)")
print(result)


// 去重测试
list = "abb".characters
result = heapsAlgorithmPermutationNonRecursive(list: list)
print("未去重前结果:\n\(result)")

let combine = result.flatMap { (c) -> String in
    let r = c as! [Character]
    return r.reduce("") {a,b in
        a + String(b)
    }
}
let norepeat = Set(combine)
print("去重后:\n\(norepeat)")

猜你在找的Swift相关文章