洗牌演算法 優雅地有邏輯地打亂陣列

2021-10-23 05:37:08 字數 479 閱讀 4446

早晨例行複習排序的時候突然想起了之前被問過的乙個題,打亂乙個陣列,越亂越好。

其實之前也聽說過,貌似叫洗牌演算法,當時答了上來,每次都產生乙個此位置外的隨機數,交換,然後往後迴圈此方法。

但是不夠嚴謹,其實可以邏輯嚴謹一點。我要保證每個數不在原先的位置,那我可以順序來搜尋這個陣列,比如在n位置,我就找個n-1裡的數字和他交換。此時n位置一定不是原數,同樣,n-1時找n-2裡的隨機數,交換。

**非常簡單:

void

rand_swap

(vector<

int>

& res)

}

結束,時間複雜度o(n),空間複雜度o(1),這是乙個原地打亂的演算法,原始陣列被修改,從後往前修改,所以無法處理動態變化的陣列。從前往後掃瞄就可以處理動態變化的陣列了。

其實並沒有很難,就是邏輯要嚴謹一些,寫出來記錄一下吧,也是突然看排序想到的。如果有其他方法可以跟我說下。

優雅地使用Android ViewPager2

viewpager2 是 viewpager 庫的改進版本,可提供增強型功能並解決viewpager的一些問題 viewpager有兩個弊端 1 不能關閉預載入,2 更新adapter不生效。我們在載入資料的時候,viewpager缺省會幫我們預載入前後兩個頁面的資料,但是這兩個view是不可見的,...

如何優雅地寫部落格

如何優雅地寫部落格 現在寫部落格面臨著幾個問題 編寫麻煩,大部分的部落格編輯器都很爛,csdn和等等。維護麻煩,維護多個部落格的資料同步很麻煩。歷史檢視,大部分部落格編寫都不能檢視之前的歷史資料。用github做部落格倉庫,將資料都寫在github上,這樣可以隨時檢視一年前的部落格資料,方便在原文件...

如何優雅地書寫JavaScript

這篇文章包含了幾乎所有關於提高 質量的內容,尤其是在構建大型應用程式時。主要包括四個部分 本主題僅涉及原生js,關於框架 比如react和vue 的內容會在以後的文章中展現。我想你們大多數人之前都聽說過solid,也就是物件導向設計裡的solid原則。這些原則基於物件導向設計,所以可能不適合其他程式...