最坏输入里就有有序的

算出最坏比较次数之后,再看看已经排好序的输入 {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 编译。)

开始练习 →