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. 


  • 相关阅读:
    CCF CSP 题解
    CCF CSP 2019032 二十四点
    CCF CSP 2018121 小明上学
    CCF CSP 2019092 小明种苹果(续)
    CCF CSP 2019091 小明种苹果
    CCF CSP 2019121 报数
    CCF CSP 2019031 小中大
    CCF CSP 2020061 线性分类器
    CCF CSP 2020062 稀疏向量
    利用国家气象局的webservice查询天气预报(转载)
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6897224.html
Copyright © 2011-2022 走看看