不可思议的排序大全:欢迎dalao前来
  • 板块灌水区
  • 楼主O2人
  • 当前回复40
  • 已保存回复40
  • 发布时间2018/7/30 12:53
  • 上次更新2024/7/4 16:23:08
查看原帖
不可思议的排序大全:欢迎dalao前来
98390
O2人楼主2018/7/30 12:53

你从未见过的排序!

1.猴子排序:测测你的RP让猴子把卡片扔在空中,等落下的时候观察这些卡片是否从左到右已经排序完成(我们认为不会发生卡片落地后叠在一起的情况)如果有序则排序完成,否则让猴子再扔一遍,直到卡片有序。

简单来说就是随机打乱数组,检查是否排好序,若是,则输出,否则再次打乱,再检查...最佳情况O(n),平均O(n*n!),最坏可执行直到世界的尽头。

BOGO:

//如果你RP值爆表,那么恭喜你,O(N)的复杂度
#include <bits/stdc++.h>
using namespace std;
int n,a[100005];
inline void random_(){
    for (int i=1;i<=n;i++) swap(a[i],a[i+rand()%(n-i+1)]);
    //打乱,AC全靠RP
}
inline bool check(){
    for (int i=2;i<=n;i++) if (a[i]<a[i-1]) return false;
    return true;
    //判断是否有序
}
inline void bogo_sort(){
    while (!check())
    random_();
    //核心代码
}
int main(){
    scanf("%d",&n);
    srand(time(NULL));
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    bogo_sort();
    for (int i=1;i<=n;i++) printf("%d ",a[i]);
    return 0;
}

2.~~正经的排序:~~睡眠排序:

比如给定一个带排序列表,中间有n个元素 ,那么睡眠排序在算法开始的时候会设置n个线程,让n个分别对应与n个数字,之后会为每一个线程设置该数字对应的休眠时间,休眠时间肯定有大小啊,谁的休眠时间先结束谁就先输出,直至最后一个数字输出结束为止。

时间复杂度:max(A[i])毫秒

SLEEP:尽管我也不会。。。

3.臭皮匠排序: 如果最后一个值小于第一个值,则交换它们

如果当前子集元素数量大于等于3:

使用臭皮匠排序前2/3的元素

使用臭皮匠排序后2/3的元素

再次使用臭皮匠排序前2/3的元素

code:

#include <bits/stdc++.h>
   using namespace std;
   int n,a[100005];
   void ssort(int i,int j){
       if (a[j]<a[i]) swap(a[j],a[i]);
       if (j-i+1>=3){
           int t=(j-i+1)/3;
           ssort(i,j-t);
           ssort(i+t,j);
           ssort(i,j-t);
       }
   }
   int main(){
       scanf("%d",&n);
       for (int i=1;i<=n;i++) scanf("%d",&a[i]);
       ssort(1,n);
       for (int i=1;i<=n;i++) printf("%d ",a[i]);
       return 0;
   }
2018/7/30 12:53
加载中...