伪睡眠排序(c++实现)

相信大家最近都被某位天才(bushi 写的睡眠排序刷屏了

我到想不明白这世界上怎么还有这种**

但是其实在特定环境下,睡眠排序的时间复杂度要小于冒泡sort不香是咋的

原理来说,就是给每个数字开一个进程,然后这个数字是几,就让他睡多久,数字小的先醒过来,最后结果就是一个排列好的数字串了

但是转念一想,那毕竟某场早期的睾端处理器只有4c8t AMD YES!,所以线程不是想开就开(如果有大佬搞个8路E7那就当我啥也没说)

所以我们可以只用一个线程就搞定这些事情吗

当然可以,此之谓

伪·睡眠排序算法!

废话不多说,我们直接开始讲解

#include<iostream>
using namespace std;
int main(){

	return 0;
}

首先io头文件 std命名空间 int型main函数和最后返回0就不用说了

    int i;
	cin>>i;
	int f=0;
	int a[i],b[i];
	for(int x=0;x<i;x++){
		int c=0;
		cin>>c;
		if(c==0)f++; 
		a[x]=c;
		b[x]=c;
	}

定义一个变量i作为数组的成员个数 f为计数器,负责记下已处理成员个数 数组a为需排序数组,成员大小不变化,b作为备份,其中的数字为对应成员的睡眠时长

c为输入(一个顶俩),如果c为0,f就记下一个,后面会将为什么要记0的个数

	for(int x=0;x<i;x++){
		cout<<0<<" ";
	}

现在数组里面有f个0,先将他们输出,为什么要输出还是后面讲

    int x=0;
	for(;;x++){
		if(f==i)break;
		if(b[x]!=0){
			b[x]--;
			if(b[x]==0){
				f++;
				cout<<a[x]<<" ";	
			}
		}
		if(x==i-1)x=-1;
	}

定义x作为数组b下标 

循环停止的标志是所有成员全部醒来,也就是用来记醒来成员数的f=成员总数i

同时每当x循环到最后一个成员但是f还未到达i时,就让x=-1,在下一次循环中x+1就变为0,也就是从第一个数字从新开始

之所以先把0排除,是因为当一个数字睡醒的时候,在循环中,这个数字-1会变为0;而0本身就为0,所以无法判断,就需要将其排除

那么完整版代码如下

#include<iostream>
using namespace std;
int main(){
	int i;
	cin>>i;
	int f=0;
	int a[i],b[i];
	for(int x=0;x<i;x++){
		int c=0;
		cin>>c;
		if(c==0)f++; 
		a[x]=c;
		b[x]=c;
	}
	for(int x=0;x<i;x++){
		cout<<0<<" ";
	}
	int x=0;
	for(;;x++){
		if(f==i)break;
		if(b[x]!=0){
			b[x]--;
			if(b[x]==0){
				f++;
				cout<<a[x]<<" ";	
			}
		}
		if(x==i-1)x=-1;
	}
	return 0;
}

如有错误欢迎指正 本人邮箱 xtr0928@126.com

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序和归并排序都是常见的排序算法,下面分别给你介绍它们的C++实现。 1. 快速排序(Quick Sort): 快速排序是一种基于分治思想的排序算法,它的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分小,然后再按此方法对这两部分数据分别进行快速排序,整个过程递归进行,最终得到有序的结果。 以下是快速排序C++实现代码: ```cpp #include <iostream> using namespace std; // 交换两个元素的值 void swap(int& a, int& b) { int temp = a; a = b; b = temp; } // 分割函数,将数组划分为左右两部分 int partition(int arr[], int low, int high) { int pivot = arr[low]; // 以第一个元素作为基准 int i = low, j = high; while (i < j) { // 从右向左找到第一个小于基准的元素 while (i < j && arr[j] >= pivot) j--; if (i < j) swap(arr[i++], arr[j]); // 从左向右找到第一个大于基准的元素 while (i < j && arr[i] <= pivot) i++; if (i < j) swap(arr[i], arr[j--]); } // 将基准元素放到正确的位置上 arr[i] = pivot; return i; } // 快速排序函数 void quickSort(int arr[], int low, int high) { if (low < high) { int pivotPos = partition(arr, low, high); // 划分数组 quickSort(arr, low, pivotPos - 1); // 对左子数组进行快速排序 quickSort(arr, pivotPos + 1, high); // 对右子数组进行快速排序 } } int main() { int arr[] = {5, 2, 9, 3, 7, 6, 1, 8, 4}; int n = sizeof(arr) / sizeof(arr); quickSort(arr, 0, n - 1); cout << "排序后的数组:"; for (int i = 0; i < n; i++) { cout << arr[i] << " "; } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值