本篇博文,旨在介紹洗牌演算法;並用c++實現了洗牌演算法
我們都多多少少學過幾種排序,常見的幾種排序大類有插入排序,希爾排序,選擇排序,交換排序
然而,洗牌演算法的目的是將有序的陣列進行打亂
1、利用乙個佇列
2、每次從陣列中,隨機找到乙個數;
若該數沒有被選擇過,那麼就將它放入佇列中;
如果被選擇過,就重新隨機
毋庸置疑,這個演算法是可以滿足洗牌的要求的
然而呢,讓我們看一下該演算法時間複雜度
每次選擇乙個數,可能存在已經選擇過的情況
所以該演算法的時間複雜度是o(n* n)
並且又多用到了乙個佇列,空間複雜度也不是很好
該演算法類似於插入排序
從陣列的最後乙個數(下標為i)開始,進行隨機取餘(除數為i+1,確保下標不過界)
將得到的下標對應的元素和最後乙個數交換
將最後乙個數不在視為陣列中的元素,繼續迴圈
直到只剩下第乙個元素為止
#include//列印函式
void print(int* a, size_t n)
}//測試洗牌演算法
void testshuffe()
; shuffe(a, sizeof(a) / sizeof(a[0]));
print(a, sizeof(a) / sizeof(a[0]));
}
洗牌演算法(打亂撲克牌順序)
問題描述 有乙個大小為 n 的有序陣列,如何打亂元素順序,使得任一元素在陣列的任一位置出現的概率都為 1 n?也就是說對於大小為 n 的有序陣列,有 n!種排列方式,要求能等概率的得到這 n!種結果。思路一 每次從原始陣列中隨機取乙個之前未取過的元素,新增到新陣列中。選取方法是 生成乙個 1 rem...
洗牌 發牌演算法 打亂撲克牌順序
洗牌的演算法有很多,這裡主要介紹下幾種主要的演算法。方法一 每次找乙個隨機的位置,然後將這54個數放到找的位置中。步驟 1.用乙個整型陣列記錄各個位置是否已經放置了數,如果放置了則不為0,否則為0。所以在演算法開始的時候,初始化此陣列每個元素的值都為0.2.每次產生乙個0 53之間的數,看這個位置是...
每日演算法 洗牌演算法
給定乙個n個數的序列,設計乙個演算法將其隨機打亂,保證每個數出現在任意乙個位置的概率相同 也就是說在n 個的排列中,每乙個排列出現的概率相同 假設輸入為陣列num length 隨機選乙個數,放到num 0 中,再隨機選數,如果該數已經選過,重新選,直到該數未選過時放入num 1 中,以此類推,直到...