zoukankan      html  css  js  c++  java
  • 微博预计要火一阵的SleepSort之Shell及C实现

    今日在微博看到如此奇妙的代码。竟然还有新的sort算法,对于我这样的渣渣必须研究一下,代码例如以下:

    #!/bin.bash
    function f()
    {
        sleep "$1" //sleep 这么多s
        echo "$1"
    }
    
    
    while [ -n "$1" ] //第一个參数不为空
    do
        f "$1" & //后台执行,相当于fork一个进程去执行f, 父进程同一时候继续下去
        shift //输入參数左移。也即覆盖掉第一个參数
    done
    
    wait//父进程等待子进程都结束了再继续往下,否则子进程成为孤立进程




    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. 


  • 相关阅读:
    联网获取图片, 保存用户的图像 bitmap
    使用 线程池,控制线程 , 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待:
    ImageView属性 android:scaleType="fitXY" ,拉伸图片非常好用
    Activity之间传值,Intent
    退出应用程序 按两次退出键
    修炼-------------Android TabHost,TabWidget选项卡总结
    对TabHost、TabWidget的理解分析
    poj 1847 Tram
    hdu 1874 畅通工程续
    hdu 2544 最短路
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6897224.html
Copyright © 2011-2022 走看看