目录
哈喽
众所周知,排序是每种编程都有的部分,比较常见的有
冒泡排序、桶排序、计数排序、插入排序、选择排序、堆排序等,
也有一些比较小众的排序,但这些都称不上离谱
这次来发一下离谱又奇怪的排序,都是我亲测的
时间复杂度O(∞)的排序
这种排序叫随机排序,是一位朋友告诉我的
大概就是这么个样子:
我们有一个数组arr,里面的内容是3,1,2,4,5
接下来,随机五个不同的随机数
第一次:0,4,3,2,1
arr[0]=3
arr[4]=1
arr[3]=2
arr[2]=4
arr[1]=5
这样,这个数组变成了3,5,4,2,1
还没有变成有序数组
再重复上面的步骤随机,
arr变成了1,2,4,3,5
再随机n次,哈哈!运气真好
arr变成了1,2,3,4,5
排序结束
真是离大谱
不过,我也在想怎么实现。。。
随便写了个c++的,似乎不可以实现
代码(不能实现排序,写着玩的)
有哪个大神可以帮我改一下,实现随机排序
#include<iostream>
#include<windows.h>
#include<time.h>
using namespace std;
template <class T>
bool is_sorted(T* a, int n){
int toLow=0;
int toHigh=0;
int i=0;
for (i=0;i<n;i++){
if (a[i]>a[i+1]){
toLow++;
}else if(a[i]<a[i+1]){
toHigh++;
}
}
if ((toLow==i)||(toHigh==i)) return true;
return false;
}
int main()
{
srand(time(0));
int n;
cout<<"输入元素个数:";
cin>>n;
cout<<"输入每个元素:";
int a[n]={0};
for (int i=0;i<n;i++){
cin>>a[i];
}
while (true){
int temp[100];
for(int i=0; i<=n; ++i) temp[i]=i;
for(int i=n; i>1; --i) swap(temp[i], temp[rand()%i]);
for(int i=0;i<n;i++){
a[i]=temp[i];
}
bool ret=is_sorted(a,n+1);
if(ret==true){
cout<<"排序结束,结果:";
for (int j=0;j<n;j++)
{
cout<<a[j]<<" ";
}
break;
}else{
for (int j=0;j<n;j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
continue;
}
}
return 0;
}
太阳能排序!?
真是越来越离谱了
太阳发出的阿尔法粒子偶尔能够翻转内存中的比特位,所以这种算法主要基于希望这种翻转能够使元素正确排序。运行方式如下:
检查数组是否排好序。 如果排好序,返回这个数组。 如果没有,等 10 秒钟并祈祷太阳辐射使得比特位翻转,而且使得数组排好序,重复第一步。
上面的好歹还可以代码实现,这不就是让太阳晒着电脑,每隔十秒输出一次数组吗?
不过,既然有科学证实,就试验一下
一个朋友真的自己试验了一下,把电脑放在太阳底下暴晒了两小时
最后发给我一张cpu98度的图片。。。
他都快要cpu烧烤了,也不能实现排序
指鹿为马排序
这个算法时间复杂度 O(n)。 聚集一帮人并向他们展示数组。 询问他们这个数组是否是排序好的。 干掉其中认为没有排序好的人。 重复几次,直到所有人同意这个数组是排序好的。
我就想问,这个排序是谁发明的?
现在疫情这么严重,你让我上哪找一群人?
没办法,只能随机一群人,反正这段话我是没看懂。
假如有100个人
我随机一下,0代表认为排序好了,1认为没有排序好
数组arr里的内容是5,4,3,1,2
程序运行一下,有44个认为排序好的,56个认为没有排序好的
再运行一下,有11个认为排序好的,33个认为没有排序好的
再运行一下,有6个认为排序好的,5个认为没有排序好的
再运行一下,有2个认为排序好的,4个认为没有排序好的
再运行一下,有2个认为排序好的,剩下所有人都认为排序好了
再看数组arr,里面的内容也没变呀
这种排序也无效
互联网排序
这是一种冒泡排序,但每次比较都依靠互联网的搜索。比如 “0.211 和 0.75 哪个大?”
这个我有思路,用python爬虫和正则表达式试一下
不试不知道,一试吓一跳
我*!
竟然真的能实现!
不过这个能想出来这样排序的也真是闲得蛋疼
委员会排序
排序一个包含 N 个自然数的数组,首先用纸打印出 N 份整个数组。 然后在办公室周围选择几个恰好路过的倒霉委员。每个委员对应数组中的一个数字。 给每个委员一份打印的数组,并让他们通过开会或其他手段,来决定自己代表的数字应该在有序数组中的位置。 当这些委员有结论并答复你时,数组自然排好序了。
这个解释我是没看懂,哪个好心人帮我解释一下?
互联网排序plus
从 网络上搜索标题含有“数组排序”的帖子,复制粘贴并运行其中的代码片段,直到数组排好序。这种排序算法事实上验证了整个数组。它被发表在xkcd网站上,这里有一个在线版的具体实现stacksort
关键它还真能排序
咱就是说,这到底怎么做的,哪个大神可以评论一下吗
这是怎么识别语言的呢?这是自己做了个运行器吗?
ε=(´ο`*)))唉,我还是用sort吧
睡眠排序
这个搞笑算法流传于 4chan 的 /prog/ 板块。无从查证具体出自哪位程序员,伪代码如下
procedure printNumber(n)
sleep n seconds
print n
end
for arg in args
run printNumber(arg) in background
end
wait for all processes to finish
算法运行如下: 对于数组中每个元素 x,开启一个新程序:
-
休眠 x 秒
-
打印 x 所有元素同时开始计时。 只适用于非负数字。
真是脑洞大开
无名排序
最近,Dr. Kong 新设计一个机器人Bill.这台机器人很聪明,会做许多事情。惟独对自然数的理解与人类不一样,它是从右往左读数.比如,它看到123时,会理解成321.让它比较23与15哪一个大,它说15大。原因是它的大脑会以为是32与51在进行比较.再比如让它比较29与30,它说29大.
给定Bill两个自然数A和B,让它将 [A,B] 区间中的所有数按从小到大排序出来。你会认为它如何排序?
输入
第一行: N表示有多少组测试数据. (2<=N<=5 )
接下来有N行,每一行有两个正整数A B表示待排序元素的区间范围. (1<=A<=B<=200000 B-A<=50)
输出
对于每一行测试数据,输出一行,为所有排好序的元素,元素之间有一个空格.
样例输入
2 8 15 22 39
样例输出
10 8 9 11 12 13 14 15 30 31 22 32 23 33 24 34 25 35 26 36 27 37 28 38 29 39
我记得这好像是哪年一个比赛的题吧?
算了,就当写题解了
分析:当遇到排序需要改变顺序而输出结果又是原来样子时结构体数组是比较好的选择
这题还是比较简单的
#include<stdio.h>
#include <string>
#include<algorithm>
#include<string.h>
using namespace std;
struct point
{
int x;
int y;
}a[101];
int cmp(point a,point b)
{
return a.y<b.y;
}
int main()
{
int N,n,i,t,j,h,result,m;
int s[20];
scanf("%d",&N);
while(N--)
{
scanf("%d %d",&m,&n);
t=n-m+1;
for(i=0;i<t;i++)
{
a[i].x=i+m;
h=a[i].x;
result=0;
while(h>0)
{
result=result*10+h%10;
h=h/10;
}
a[i].y=result;
}
sort(a,a+t,cmp);
for(i=0;i<t;i++)
{
printf("%d ",a[i].x);
}
printf("\n");
}
return 0;
}
这也算是一种可行的排序方法,所以应该叫它什么排序法呢?
最后
今天盘点了这几种奇怪的排序,如果哪位朋友还有其它的排序方法或你会代码实现本文中的排序方法,欢迎私信我,我对随机排序的希望是最大的