你从未见过的排序!
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;
}