美文网首页技术干货C++
多线程快排算法实现C++11

多线程快排算法实现C++11

作者: mayushengmusic | 来源:发表于2017-05-25 17:23 被阅读0次

    C++11引入了多线程库(前身Boost线程库),借助future 异步线程机制可以非常方面的实现一个多线程版本的快排序,std::async可以自动选择是创建线程时执行还是调用get的线程中执行(避免过度订阅)。
    这里的实现方法,对传入的链表是毁灭性的,排序结束,旧的无序链表将为空。

    #include <iostream>
    #include <list>
    #include <random>
    #include <future>
    #include <algorithm>
    
    
    template <typename T>
    std::list<T> fast_sort(std::list<T> &input)
    {
        if(input.empty())
            return input;
    
        std::list<T> ret;
    
        const T pivot = *(input.begin());
    
        auto div = std::partition(input.begin(),input.end(),[&pivot](const T t){return t<pivot;});
        ret.push_back(*div);
        std::list<T> high;
        high.splice(high.begin(),input,input.begin(),div);
        input.pop_front();
        std::list<T> low(std::move(input));
        std::future<std::list<T>> run = std::async(fast_sort<T>,std::ref(high));
        auto ret_high=run.get();
        auto ret_low=fast_sort(low);
        ret.splice(ret.begin(),ret_high);
        ret.splice(ret.end(),ret_low);
    
        return ret;
    
    }
    
    
    
    
    int main(){
    
    
        std::list<int> test;
        std::random_device gen;
        for(int i=0;i<1000;i++)
            test.push_back(gen()%100);
        for(auto & x: test)
            std::cout<<x<<std::endl;
        std::cout<<"-----------"<<std::endl;
        auto test_x = fast_sort<int>(test);
        for(auto & x: test_x)
            std::cout<<x<<std::endl;
    
        return 0;
    
    }
    

    相关文章

      网友评论

        本文标题:多线程快排算法实现C++11

        本文链接:https://www.haomeiwen.com/subject/xbezxxtx.html