技术干货C++

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

2017-05-25  本文已影响0人  mayushengmusic

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;

}
上一篇下一篇

猜你喜欢

热点阅读