神奇的排序

神奇的排序算法

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 \]

posted @ 2023-06-07 20:46  Melting_Pot  阅读(28)  评论(0编辑  收藏  举报