1. 程式人生 > >洗牌演算法具體指的是什麼?

洗牌演算法具體指的是什麼?

 1.背景介紹
洗牌演算法是我們常見的隨機問題,在玩遊戲、隨機排序時經常會碰到,本質是讓一個數組內的元素隨機排列。

2.知識剖析
洗牌演算法是一種隨機排序的演算法,其排序思想是:首先生成一個有序的陣列,然後從陣列中隨機抽取兩個元素交換位置,重複這個過程若干次,就變成了一個隨機的陣列。

如何實現一個簡單的洗牌演算法?           
var oneArray = [1,2,3,4,5,6,7,8];
console.log(oneArray);
Array.prototype.shuffle = function () {
    var a = oneArray;
    for(var i = a.length - 1;i >= 0; i--){
        var randomIndex = Math.floor(Math.random()*(i + 1));
        var itemAtIndex = a[randomIndex];
        a[randomIndex] = a[i];
        a[i] = itemAtIndex;
    }
    return a;
};
console.log(oneArray.shuffle());
               
            
3.常見問題

4.解決方案

5.編碼實戰

6.擴充套件思考

有複雜的洗牌演算法嗎?有

                演示一

                主要程式碼
               function shuffle(array) {                var copy = [],                n = array.length,                i;                 while (n) {                i = Math.floor(Math.random() * array.length);                if (i in array) {                copy.push(array[i]);                delete array[i];                 n--;             }         }         return copy;    }            
        
                   
 演示二

                    主要程式碼
                    function shuffle(array) {                    var copy = [],                    n = array.length,                    i;                    while (n) {                    i = Math.floor(Math.random() * n--);                    copy.push(array.splice(i, 1)[0]);                    }                     return copy;                    }                   
演示三
                    主要程式碼                    function shuffle(array) {                    var m = array.length,                    t, i;                     while (m) {                    i = Math.floor(Math.random() * m--);                    t = array[m];                    array[m] = array[i];                    array[i] = t;                    }                    return array;                    }7.參考文獻一、javascript隨機之洗牌演算法深入分析二、【演算法詳解】洗牌演算法三、陣列的完全隨機排列四、由亂序播放說開了去-陣列的打亂演算法

8.更多討論

問題一:什麼是好的洗牌演算法?

答:
洗牌之後,如果能夠保證每一個數出現在所有位置上的概率是相等的,那麼這種演算法是符合要求的;這在個前提下,儘量降低時間和空間複雜度。

問題二:演算法具有哪些特徵?

答:

穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
內排序:所有排序操作都在記憶體中完成;
外排序:由於資料太大,因此把資料放在磁碟中,而排序通過磁碟和記憶體的資料傳輸才能進行;

時間複雜度: 一個演算法執行所耗費的時間。

空間複雜度: 執行完一個程式所需記憶體的大小。

問題三:除了洗牌演算法還有其他演算法嗎?

答:有。比如:氣泡排序、快速排序、插入排序......

ppt

視訊