微博预计要火一阵的SleepSort之Shell及C实现
生活随笔
收集整理的這篇文章主要介紹了
微博预计要火一阵的SleepSort之Shell及C实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今日在微博看到如此奇妙的代碼。竟然還有新的sort算法,對于我這樣的渣渣必須研究一下,代碼例如以下:
#!/bin.bash function f() {sleep "$1" //sleep 這么多secho "$1" }while [ -n "$1" ] //第一個參數不為空 dof "$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.?
總結
以上是生活随笔為你收集整理的微博预计要火一阵的SleepSort之Shell及C实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vijos P1696 数与连分数【连分
- 下一篇: Linux 中 SVN 重启关闭