微博估计要火一阵的SleepSort之Shell及C实现
来源:互联网 发布:log4net Oracle数据库 编辑:程序博客网 时间:2024/06/05 03:17
今日在微博看到如此神奇的代码,居然还有新的sort算法,对于我这种渣渣必须研究一下,代码如下:
#!/bin.bashfunction f(){ sleep "$1" //sleep 这么多s echo "$1"}while [ -n "$1" ] //第一个参数不为空do f "$1" & //后台运行,相当于fork一个进程去执行f, 父进程同时继续下去 shift //输入参数左移,也即覆盖掉第一个参数donewait//父进程等待子进程都结束了再继续往下,否则子进程成为孤立进程
SleepSort,一看代码,看到sleep大致就明白意图了,利用sleep,以及多线程并发,按照sleep大小排序,并发来print排序
这个算法本质上是并发的算法,运用了sleep函数,同时几个进程并发,并发是指几个进程同一时间段同时执行,一个时刻还是要排个序逐个执行的,而并行是需要硬件支持的,真正的同一时刻多个进程同时运行。
于是乎本菜鸟打算C语言搞一搞,因为借助linux的fork函数来模拟 shell里面 &的后台运行功能。另外上述代码接口不太好,最好是传递数组参数这种的,于是我写个接口比较general的C版
另外这里面要注意就是shell wait等前面子进程全部结束,父进程才继续。我用C总是输出第一个数父进程就返回了,差了C的文档才知道,他是任意一个child返回父进程就返回了,因此多次wait 用个loop。
代码(*nix OS only):
#include <iostream>#include <sys/wait.h>using namespace std;void f(int x){ sleep(x); cout<<x<<" ";}void SleepSort(int*a, int n){ int status; pid_t pid; for(int i=0;i<n;i++) { pid=fork(); if(pid==0)//child process, return 0 pid { f(a[i]); return; } else//father process return pid>0 { ; } } for(int i=0;i<n;i++) wait(NULL);//each wait one child process, then continue}int main(){ int a[]={6,2,5,8,5,4,7,1}; SleepSort(a,8);}
按照这个思想,其实任何并行的技术理论都可以实现sleepsort,例如CUDA,openmp, mpi等等,我这里弄个并发版本。
另外确实要用最小单位s的sleep函数,稍微注意一下就好了~~~ 下面博客说的比较清楚~~~
http://blog.csdn.net/changingivan/article/details/6966510
收到这个启发,这个算法有个缺陷,如果排序的树interval很小,例如1.1 1.11这种,也可能有危险,最小sleep差比一次loop时间长是关键
今天一个马来人说很崇拜中国的gymnastics,我第一反应geometry, 后来才知道体操。。另外一个阿三教了我一点rude english,之前一直问我what's up?这个是很标准的美式口语.......今天居然说了I need a chick, 我已开始以为是trick,但是也说不通。他说,如果说一个女生是chick是很粗鲁的,还有barbanic 也是粗鲁的意思。
Good night, bitch! Get your life 享受生活,别那么书呆!Working hard,no, hardly working.
0 0
- 微博估计要火一阵的SleepSort之Shell及C实现
- Java 之 SleepSort排序
- SleepSort算法——Java实现
- c 实现的shell
- Shell排序算法及C语言实现
- 夏天里的一阵凉风
- 有一阵莫名的悲哀
- shell排序的c实现
- 利用Unix-ECF实现睡眠排序(SleepSort)和闹钟(Alarm)
- 几种常用的经典频谱估计方法原理介绍及Matlab算法实现
- 使用EM算法估计GMM参数的原理及matlab实现
- 网络带宽估计的方法及问题综述
- 她只是一阵来自原野的风
- 一阵杂乱的脚步声打乱了
- 实现求某天的前一天操作(C++,shell)
- shell排序算法的C/C++实现
- Linux Shell命令的C语言实现
- 用c实现的简单linux shell
- 打卡13-perl function-reverse/chop
- hibernate的hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size 25简介
- 交通灯管理系统
- 汉诺塔问题的递归求解
- springMVC文件上传
- 微博估计要火一阵的SleepSort之Shell及C实现
- Clone Graph
- C/C++大文件/数据网络传输方法总结
- PHP正则表达式匹配嵌套HTML标签的方法和技巧
- 【KMP】 HDOJ 3613 Best Reward
- 新手报到
- 序列参数集层(SPS)句法-学习
- Error: Most middleware (like bodyParser) ...
- L6218E: Undefined symbol __ENTRY (referred from mmu.o).