今日在微博看到如此奇妙的代碼。竟然還有新的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.?