线程与排序(睡眠排序C语言实现)

        线程在排序方面也有特殊的应用,我们可以把要排序的数都为其创建一个线程,根据数的值对其进行延时操作,线程中的值越大,其结束的越晚,里面的数出来的也越晚,所以自然可以将数据排出序来,当然,若数据较多,会十分消耗计算机资源,所以也是图一乐的一种思想,具体代码如下:

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<string.h>
int data[100]={0};//储存乱序数
void* fun_1(void *agv)//用于实现按数倒计时
{
	usleep((*(int*)(agv))*10000);//us级的时间会影响准确度,所以做一些延长
	printf("%d ",*(int*)(agv));
	return 0;
}
int main(void)
{
	pthread_t a[10];
	int i=0;
	int j=0;
	void *ret=NULL;
	printf("please input your data (enter '1' three time to end)\n");
	while(1)
	{
		scanf("%d ",&data[i]);//获取输入的乱序数
		if(data[i]==1 && data[i-1]==1)
		{
			break;
		}
		i++;
	}
	printf("ending input\n");
	for(j=0;j<i;j++)
	{
		pthread_create(&a[j],NULL,fun_1,&data[j]);//创造倒计时线程
	}
	sleep(1);
	for(j=0;j<i;j++)
	{
		pthread_join(a[j],ret);
	}
	return 0;
}

        值得注意的是,以上排序不能计算负数,如果数据过大效率也会下降,所以仅仅作为启发代码使用,当然,以上问题可以通过优化来解决,比如负数的排序,可以通过增加判断以及取反来实现;而数字过大也可以通过取对数来实现,作为一条懒狗,我这里就不献丑了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值