洗牌演算法是我們常見的隨機問題,在玩遊戲、隨機排序時經常會碰到。它可以抽象成這樣:得到乙個m以內的所有自然數的隨機順序陣列。
洗牌演算法大多都是建立在隨機數的基礎上的,現在介紹幾種隨機數基礎上的隨機洗牌演算法:
(1)第一種可以簡單描述成:隨機抽牌,放在另一組;再次抽取,抽到空牌則重複抽。抽到空牌則重新抽的話,越到後面抽到空牌的機率就越大,所以顯然是不合理的。我們可以進一步優化:拍抽走後,原牌變少,我們把抽走的牌之後的牌往前移一位,來填補空牌的空缺。**如下:
vector
shuffle_pick_1(size_t m)
return vec2;
}
這個也明顯有問題,因為陣列如果很大的話,刪除中間的某個元素,會導致後面的排隊向前走一步,這是乙個很耗時的動作。
回想一下「我們為什麼要刪除那個元素?」目的就是為了不產生空牌。
除了刪除那個元素之外,我們是不是還有其它方式來去除空牌?
—-有的,我們把最後一張未抽的牌放在那個抽走的位置上就可以了。
所以,這個思路我們可以優化成這樣:
未完待續。。。
八大排序演算法,一天乙個
因為還在學習的階段,其實我對於八個排序演算法中的堆排序和歸併排序還是挺懵的 氣泡排序是乙個簡單的排序演算法,核心思想是兩兩比較,每次迴圈將最大 最小 的數移動到陣列末端,然後進行第二次迴圈 直到陣列有序。演算法的時間複雜度為 n 效率較低。public static void bubblesort ...
一天乙個CRT函式 strdec
換作業系統了,win7果然好用!而且對於每天12小時以上盯 著電腦的我來說,視覺感受也很重要!贊,乙個字!來看看 strdec字串函式吧,該函式比較兩字串,pstr1和pstr2必須指向同一source,如果pstr2所指向pstr1的後面的字元,則返回pstr2前乙個位置的字元位址,否則返回nul...
一天乙個CRT函式 memmove
前面講到memcpy把源緩衝區的資料賦值到目標緩衝區中。再來看一下該函式宣告 void memcpy void dest,const void src,size t count 他並沒有規定src所指向緩衝區與dest指向緩衝區必須不同。比如出現這種情況 char s 32 abcdefg 2 ch...