神奇的排序
神奇的排序算法
1.猴子排序
#include<iostream>
using namespace std;
bool isSorted(int a[], int n){
while (--n > 1)
if (a[n] < a[n - 1])
return false;
return true;
}
void shuffle(int a[], int n){
for (int i = 0; i < n; i++)
swap(a[i], a[rand() % n]);
}
void bogosort(int a[], int n){
while (!isSorted(a, n))
shuffle(a, n);
}
void printArray(int a[], int n){
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
}
int main(){
int a[] = { 3, 2, 5, 1, 0, 4 };
int n = sizeof a / sizeof a[0];
bogosort(a, n);
printf("Sorted array :\n");
printArray(a, n);
return 0;
}
利用对于命运的神奇掌握,对于已知数列的随机打乱,然后检定其是否有序的算法,它优秀的空间复杂度能极大得满足我们追求卓越的心。
缺点:使用前需要正衣冠,正心神,焚香沐浴,占天问地,时间复杂度 \(O(N!*N)\) 或 \(0\)
P.S. 还有量子猴排,傻__猴排等神级算法,大家可自行了解
一道例题:P1177 谁拿这玩意儿A了我叫他蝶
2.珠子排序
看见这个神奇的玩意了吗?我们把待排数列当成一堆穿在串上的珠子,然后————轰!的一声加上重力,珠子就下落成了我们想要的模样
#include<bits/stdc++.h>
using namespace std;
#define N 1000
int aba[N][N]={0};
int large;
void input_data(int num[]){
int i=0;
char ch;
do{
cin>>num[i];
ch=cin.get();
i++;
} while (ch!='\n');
large=i;
}
int main(){
int cc;scanf("%d",&cc);
int count=0;
int num[N];
input_data(num);
for (int i=0;i<large;i++)
for (int j=0;j<num[i];j++) aba[i][j]=1;
int p(0);
//轰!!!上重力!!!
for (int j=0;j<N;j++){
for (int i=large-1,p=0;p<=i;i--,p++){
while (!aba[p][j]){
if (i==p) break;
p++;
}
while (aba[i][j]==1){
if (i==p) break;
i--;
}
for (;aba[i][j]==0&&aba[p][j]==1;){
swap(aba[i][j],aba[p][j]);
if (i==p||p+1==i) break;
p++;i--;
}
}
}
for (int i=0;i<large;i++){
for (int j=0;j<20;j++){
if (!aba[i][j]) break;
if(aba[i][j]==1) count++;
}
num[i]=count;
count=0;
}
cout<<endl;
for (int i=0;i<large;i++) cout<<num[i]<<" ";
return 0;
}
一道例题:p1177
然后你会获得:
缺点:没啥优点(宁可以来找一找)
3.睡眠排序
睡眠排序也称为硬件排序, 充分利用硬件计时器的资源实现拟态算法:睡眠排序的主要逻辑是构造n个线程,它们和这n个数一一对应。初始化后,线程们开始睡眠,等到对应的那么多个时间单位后各自醒来,然后输出对应的数。这样最小的数对应的线程最早醒来,这个数最早被输出。等所有线程都醒来,排序就结束了。
时间复杂度:\(O(N)\)
#include<cstdlib>
#include<chrono>
#include<iostream>
#include<thread>
#include<vector>
#include <algorithm>
void SleepSort(const int i, const int offset){
std::this_thread::sleep_for(std::chrono::milliseconds(i + offset));
std::cout << i << " ";
}
int main(){
std::cout << "Sorted array is:\n";
std::vector<std::thread> threads;
std::vector<int> num;
int x;
while (std::cin >> x )
num.push_back(x);
std::vector<int> data;
data.reserve(num.size() - 1);
for (int i = 0; i < num.size(); ++i)
data.push_back(num[i]);
const int minElem = std::abs(*std::min_element(data.begin(), data.end()));
for (int i = 0; i < num.size(); ++i)
threads.push_back(std::thread(SleepSort, num[i],minElem));
for (auto& thread : threads)
thread.join();
return 0;
}
代码粘的,正确与否说不好
优缺点:不知道
ALL RIGHT! 先结束了,之后会继续跟进的!
\[\\2023.6.7\\E.O.F
\]