
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".charactersvar 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".charactersresult = 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版全排列-Heap's Algorithm全部内容,希望文章能够帮你解决Swift版全排列-Heap's Algorithm所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)