最坏输入里就有有序的
算出最坏比较次数之后,再看看已经排好序的输入 {0,1,2,3,4} 花了多少次,以及它是不是正好就在最坏那一档(是就 1)。输出「最坏/有序输入的次数/是否最坏」。 (本题用 g++ -std=c++17 -O0 编译。)
期望正好等于那个平均
随机快排的期望比较次数(expect(5)),和「固定取第一个」在全部 120 种输入上的平均,把这两个数比一比。用分数算,别用浮点。输出「期望的分子/分母/相等或不等」。 (本题用 g++ -std=c++17 -O0 编译。)
期望不随输入而变
三个输入:已排好序、完全逆序、乱序。固定取第一个当枢轴各比多少次?再判一下随机枢轴的期望在这三个输入上是不是同一个数。输出如 10/10/6/不随输入变。 (本题用 g++ -std=c++17 -O0 编译。)
为什么别用 rand() 取模
第 1 步:同样排好序的 6 个数 第 2 步:随机抽到了中间那个 第 3 步:两边各剩差不多一半 第 4 步:每边再随机抽一个 第 5 步:层数只有 log n 那么多 1 2 3 4 5 6 竞赛和工程里都不推荐用 rand() % n
给 mt19937 固定种子
写 mt19937 rng(2026); 给随机数引擎固定一个种子,好处是【0】。
均匀分布取值的范围
uniform_int_distribution<int> d(1, 6); 产生的是【0】。
默认种子的第一万个数
C++ 标准直接规定了:默认构造的 mt19937(种子 5489),第 10000 次调用得到的数是一个固定值。运行下面这段程序: #include <iostream> #include <random> usi
同一个种子的两个引擎
两个用同一个种子构造的引擎,各抽三个数比一比: #include <iostream> #include <random> using namespace std; int main() { mt19937
补全随机选枢轴
补全随机枢轴快排:在 [l, r] 里随机挑一个下标,把它换到最右边当枢轴。输入是已经排好序的 1..2000,输出「是否排好/是否退化」(比较次数不到固定枢轴的十分之一就算不退化)。随机数用固定种子,结果与机器快慢无关。 (本题用 g++
先洗牌再用固定枢轴
另一种随机化:不改快排本身,排序前先用 shuffle 把数组随机打乱。补全后在已排好序的 1..2000 上跑,输出同样的两项。 (本题用 g++ -std=c++17 -O0 编译。)