花里胡哨
猴子排序
(提供者cy1306110516)
猴子排序的思想源自于著名的 无限猴子定理。
既然猴子们能敲出《哈姆雷特》,区区排序又算什么呢?
思路:
- 判断数组是否有序,如果无序,进入下一步。
- 随机打乱数组,回到上一步。
适用人群:
欧皇
时间复杂度:
- 最坏情况 $_math_inline$O(\infty)$math_inline_$
- 最好情况 $_math_inline$O(n)$math_inline_$
算法实现:
1#include <bits/stdc++.h>
2using namespace std;
3int n,a[100005];
4inline void random_(){
5 for (int i=1;i<=n;i++) swap(a[i],a[i+rand()%(n-i+1)]);
6 //打乱,AC全靠RP
7}
8inline bool check(){
9 for (int i=2;i<=n;i++) if (a[i]<a[i-1]) return false;
10 return true;
11 //判断是否有序
12}
13inline void bogo_sort(){
14 while (!check())
15 random_();
16 //核心代码
17}
18int main(){
19 scanf("%d",&n);
20 srand(time(NULL));
21 for (int i=1;i<=n;i++) scanf("%d",&a[i]);
22 bogo_sort();
23 for (int i=1;i<=n;i++) printf("%d ",a[i]);
24 return 0;
25}//提供者cy1306110516
钻石排序
(提供者DARTH_VADER)
钻石排序(又名戴蒙德排序)的思想源自于演化生物学家贾雷德·戴蒙德的作品 《枪炮、病菌与钢铁》 。
思路:
- 对于数组中的每一项,创造一个等同人数的人类部落。
- 让他们独立地发展。
- 第一个发展出枪支的最大,以此类推。
适用人群:
极远未来的统治阶层
时间复杂度:
$_math_inline$O(n)$math_inline_$ ,常数为13000年。
代码实现:
暂无
恶魔排序
(提供者DARTH_VADER)
恶魔排序的思想源自于十九世纪英国物理学家詹姆斯·克拉克·麦克斯韦的 麦克斯韦恶魔假说。
思路:
创造这样的一种气体:其每一个分子运动速度与数组中的每一个数成比例。
将这样的气体灌入一个密封的盒子,该盒子被一分为二,中间有一个小孔接通两侧。
小孔一次只能经过一个分子。
每一次迅速打开小孔,让特定分子经过。
那么长时间后,盒子将一侧热一侧冷。
对于每一侧,分治进行本算法。
适用人群:
麦克斯韦的恶魔
时间复杂的:
$_math_inline$O(n!)$math_inline_$代码实现:
暂无
珠排序
(提供者502_Bad_Gateaway)
珠排序的思想源自于中国历史悠久的 算盘。(大雾)
思路:
- 对于每一个数字,我们用一排珠子表示。
- 将这些珠子叠在一起,使其自然下落。
- 每一层的珠子数量即为该位置数值。
珠排序示意图
适用人群:
喜好珠算的OIer
时间复杂度:
这个。。。呃呃呃看你怎么说了
代码实现:
等一下哈,本人正在敲
怂货地精排序
(提供者502_Bad_Gateaway)
怂货排序。。。很怂。
思路:
- 当i=0或a[i]>a[i-1]时,i++。
- 否则交换a[i]与a[i-1],i–。
适用人群:
正常人类
时间复杂度:
$_math_inline$O(n^2)$math_inline_$代码实现:
1void gnome_sort(int *unsorted[]){
2 int i = 0;
3 while (i < unsorted.Length){
4 if (i == 0 || unsorted[i - 1] <= unsorted[i])i++;
5 else{
6 int tmp = unsorted[i];
7 unsorted[i] = unsorted[i - 1];
8 unsorted[i - 1] = tmp;
9 i--;
10 }
11 }
12}//提供者DARTH_VADER
智能设计排序
(提供者DARTH_VADER)
智能设计排序的思想源自于 智能设计论(智设论)。
思路:
假设我们有一些数字(它们组成了给出的数组),那么它们恰好排序成给出的数组的概率是 $_math_inline$\frac{1}{n!}$math_inline_$
面对如此小的可能性,我们断言这样的数组是随机出现的,未免太过果断。
有理由相信,这样的一个数组是一个有自我意志的排序者给出的。
由于我们对排序的认知被局限在递增或递减,揣摩排序者用意的行为是不理智的。
因此大可放心:数组已被排序!
适用人群:
懒人
时间复杂度:
$_math_inline$O(0)$math_inline_$ ,当然算上输入就是 $_math_inline$O(n)$math_inline_$
代码实现:
1#define donothing return
2void intelligentDesignSort(int list[]){
3 donothing;
4}//提供者DARTH_VADER
指鹿为马排序
(提供者life_w_back)
指鹿为马排序的思想源自于典故 指鹿为马。
思路:
选取若干无辜路人,重复执行以下操作直至所有人认为数组已排序:
- 询问数组是否已排序。
- 杀死所有说没排序的。
适用人群:
赵高
时间复杂度:
$_math_inline$O(1)$math_inline_$ ,常数为1分钟。
代码实现:
本算法须手动实现。
“生命,宇宙与一切”排序
(提供者AThousandSuns)
“生命,宇宙与一切”排序的思想来源于 银河系漫游指南。
思路:
在每两个数之间插入42,然后提交给深思。
适用人群:
道格拉斯·亚当斯
时间复杂度:
$_math_inline$O(n^2)$math_inline_$ ,常数约为1000万年。
代码实现:
1void ftSort(int *list[],int size){
2 for(int i=1;i<size-1;i++){
3 for(int j=size;j>i;j--){
4 list[j]=list[j-1];
5 }
6 list[i]=42;
7 }
8}//提供者DARTH_VADER
除另有声明外,本博客文章均采用 知识共享 (Creative Commons) 署名 4.0 国际许可协议 进行许可。转载请注明原作者与文章出处。