3

伙计们,我正在考虑一种排序方法,它称为睡眠排序

#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int c, char **v)
{
    while (--c > 1 && !fork());
    sleep(c = atoi(v[c]));
    printf("%d\n", c);
    wait(0);
    return 0;
}

我不明白一件事,c ++ 11中的fork等价物是什么?我的意思是新版本的c ++?我可以写这样的等待函数

void wait ( int seconds ){
    clock_t endwait;
    endwait = clock () + seconds * CLOCKS_PER_SEC ;
    while (clock() < endwait) {}
}

但是 fork() 呢?我尝试了以下代码

#include<iostream>
#include<time.h>
using namespace std;;

void wait ( int seconds ){
    clock_t endwait;
    endwait = clock () + seconds * CLOCKS_PER_SEC ;
    while (clock() < endwait) {}
}

void Sort(int c,int a[])
{
    while(--c>1)
    {
        wait(c=a[c]);
        cout<<c<<"  ";
    }
 }

int main()
{
    int a[]={1, 3, 2, 11, 6, 4};
    int c=5;
    Sort(c,a);
    wait(0);

    return 0;
}

但它没有给我排序的输出,它输出像 6 4 1 并完成,所以请告诉我如何纠正它?

4

5 回答 5

3

你不能像你的wait()职能那样简单地拖延;这是通过为每个参数创建一个新进程(通过fork())并让每个参数并行睡眠来实现的;您的建议将使每个元素串联睡眠,因此不会给人一种错觉。

至于what is fork equivalent in c++ 11?-- fork() 不是特定于 C 或 C++ 的;它是操作系统提供的功能。

于 2012-09-07T20:32:58.427 回答
1

你没有理解重点。等待必须并行运行(由 fork 触发,它为每个项目创建一个新线程)。

于 2012-09-07T20:33:26.570 回答
1

虽然有更多的事情要谈,但我只会回答你的主要问题。

c=5虽然你有 6 个数字,但你已经设置while(--c>1)了,如果你计算,它只运行循环 3 次,因为如果你--在运算符之前添加它,它会先减去 1,然后比较。

  • c=5
  • while(--c>1)[减去 1 of 5=4 并检查是否大于 1] //运行它
  • while(--c>1)[减去 1 of 4=3 并检查是否大于 1] //运行它
  • while(--c>1)[减去 1 of 3=2 并检查是否大于 1] //运行它
  • while(--c>1)[减去 1 of 2=1 并检查是否大于 1] //不运行它

您必须更改您拥有c的数字数量:c=6,然后像这样更改while循环:while(c-->0)

于 2012-09-07T20:50:22.943 回答
0

这是使用 Win32 在 C++ 中的工作实现:

#include <windows.h>
#include <iostream>

using namespace std;

DWORD threadFunc(LPVOID param)
{
    long val = (long)param;
    Sleep((int)val * 1000);
    cout << val << " ";
    return 0;
}

int main()
{
    HANDLE handles[6];
    int arr[] = {1, 3, 2, 11, 6, 4};

    for(int i = 0; i < 6; i++)
    {
        handles[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&threadFunc, 
                                  (LPVOID)arr[i], 0, NULL);
    }

    WaitForMultipleObjects(6, handles, 1, INFINITE);
}
于 2012-09-07T21:47:52.930 回答
0

跨平台版本。支持负数!

#include <iostream>
#include <vector>
#include <thread>
#include <chrono>
#include <algorithm>

template< typename It >
void sleepSort( const It& begin, const It& end )
{
    if ( begin == end )
        return;
    const auto [min, max] = std::minmax_element( begin, end );
    for ( auto it = begin; it != end; ++it )
    {
        std::thread( [min = *min, i = *it]
            {
                std::this_thread::sleep_for( std::chrono::milliseconds( i - min ) );
                std::cout << i << std::endl;
            } ).detach();
    }
    std::this_thread::sleep_for( std::chrono::milliseconds( *max - *min + 1 ) );
}

int main( int argc, char *argv[] )
{
    std::vector<int> v = { 20, 5, 15, 10, -5, };
    sleepSort( v.begin(), v.end() );

    return 0;
}

输出:

-5 5 10 15 20

于 2018-11-21T10:17:59.870 回答