簡單洗牌算法 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)) ")
發佈了45 篇原創文章 · 獲贊 39 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章