1. 程式人生 > >簡單洗牌演算法 swift3.0

簡單洗牌演算法 swift3.0

Knuth 和Durstenfeld 在Fisher 等人的基礎上對演算法進行了改進。 每次從未處理的資料中隨機取出一個數字,然後把該數字放在陣列的尾部,即陣列尾部存放的是已經處理過的數字 。這是一個原地打亂順序的演算法,演算法時間複雜度也從Fisher演算法的 O ( n 2 )提升到了 O ( n )。

//************* 洗牌演算法 ************
// [1 8]下面的方法是隨機 1到 8之間的一個數
var nameArr = [2, 4, 45, 44]
func getRandomByQuJian(startIndex:Int, endIndex:Int)->Int {
    let  index2 = Int(arc4random_uniform(UInt32(endIndex - startIndex)) + UInt32(startIndex))
    return
index2 } func getRandomByArr(arrValue:inout [Int]){ // 遍歷每個資料來源 for i in 0..<arrValue.count { let index1:Int = getRandomByQuJian(startIndex:i,endIndex:arrValue.count-1) // 這個方法是交換 陣列中兩個資料的位置,最後達到資料打亂的目的 (arrValue[i], arrValue[index1]) = (arrValue[index1], arrValue[i]) //檢視當前位置
print( i,index1) print(arrValue) } } print("值:\(getRandomByArr(arrValue: &nameArr)) ")