Which type of sorting is used in the std::sort()?

后端 未结 7 1197
无人共我
无人共我 2020-12-01 09:34

Can anyone please tell me that which type of sorting technique (bubble, insertion, selection, quick, merge, count...) is implemented in the std::sort() function

相关标签:
7条回答
  • 2020-12-01 09:40

    Do you mean std::sort? If so it can be implemented any way they want. Its probably Quick sort but could be radix or something else. As long as it produces you a sorted list in at least O(n log n) the implementation is fine, afaik.

    0 讨论(0)
  • 2020-12-01 09:46

    Just some empirical results:

    I translated a python script using numpy 1.9.2 sort to C++ using std::sort (VS2008 toolchain).

    I only get the same exact results in the python and C++ sides when I use numpy.sort argument kind='mergesort'. I get different relative ordering for elements with same key when kind='quicksort' or kind='heapsort'. So I guess that at least for the version of STL that comes with VS2008 std::sort uses mergesort.

    0 讨论(0)
  • 2020-12-01 09:49

    Most implementations of std::sort use quicksort, (or usually a hybrid algorithm like introsort, which combines quicksort, heapsort and insertion sort).

    The only thing the standard requires is that std::sort somehow sort the data according to the specified ordering with a complexity of approximately O(N log(N)); it is not guaranteed to be stable. Technically, introsort better meets the complexity requirement than quicksort, because quicksort has quadratic worst-case time.

    0 讨论(0)
  • 2020-12-01 09:49

    GCC 9.2.0 libstdc++ source confirming introsort

    Others have mentioned introsort, but here is some evidence for libstc++, which is the default C++ implementation on most Linux distros.

    libstdc++ is a part of GCC itself, so we will look into GCC source.

    libstdc++-v3/include/std/algorithm is the main header and contains:

    #include <bits/stl_algobase.h>
    #include <bits/stl_algo.h>
    

    Then, bits/stl_algo.h contains the definition of the sort overloads, one of them being:

      /**
       *  @brief Sort the elements of a sequence.
       *  @ingroup sorting_algorithms
       *  @param  __first   An iterator.
       *  @param  __last    Another iterator.
       *  @return  Nothing.
       *
       *  Sorts the elements in the range @p [__first,__last) in ascending order,
       *  such that for each iterator @e i in the range @p [__first,__last-1),  
       *  *(i+1)<*i is false.
       *
       *  The relative ordering of equivalent elements is not preserved, use
       *  @p stable_sort() if this is needed.
      */
      template<typename _RandomAccessIterator>
        inline void
        sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
        {
          // concept requirements
          __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
            _RandomAccessIterator>)
          __glibcxx_function_requires(_LessThanComparableConcept<
            typename iterator_traits<_RandomAccessIterator>::value_type>)
          __glibcxx_requires_valid_range(__first, __last);
          __glibcxx_requires_irreflexive(__first, __last);
    
          std::__sort(__first, __last, __gnu_cxx::__ops::__iter_less_iter());
        }
    

    so we see that this just does a bunch of sanity checks on the input, and then calls std::__sort which is defined in the same file:

      template<typename _RandomAccessIterator, typename _Compare>
        inline void
        __sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
           _Compare __comp)
        {
          if (__first != __last)
        {
          std::__introsort_loop(__first, __last,
                    std::__lg(__last - __first) * 2,
                    __comp);
          std::__final_insertion_sort(__first, __last, __comp);
        }
        }
    

    and I'll stop here that we have reached an identifier called std::__introsort_loop, the rest of the implementation is on the same file is anyone still has doubts.

    It should also be possible to GDB step debug into std::sort without any further setup in Ubuntu 18.04 as mentioned for std::set at: What is the underlying data structure of a STL set in C++?

    C++17 parallel sorting

    We now also have parallel sorting, so it would be worth looking on how it is done as well: Are C++17 Parallel Algorithms implemented already?

    As mentioned in the above answer, the implementation relies on an external library: Intel Thread Building Blocks: https://github.com/intel/tbb

    0 讨论(0)
  • 2020-12-01 09:51

    There are three algorithms that are used in MSVC2013 STL, referring to the source code of std::sort.

    It is most likely to use QuickSort, or a variation over QuickSort called IntroSort.

    If the recursion goes too deep, the HeapSort will be used here.

    Otherwise InsertSort will be used.

    0 讨论(0)
  • 2020-12-01 09:52

    C++ Standard ISO/IEC 14882:2003

    25.3.1.1 sort

    template<class RandomAccessIterator>
       void sort(RandomAccessIterator first, RandomAccessIterator last);
    template<class RandomAccessIterator, class Compare>
       void sort(RandomAccessIterator first, RandomAccessIterator last,
              Compare comp);
    

    1 Effects: Sorts the elements in the range [first, last).

    2 Complexity: Approximately N log N (where N == last - first) comparisons on the average.

    There is no information about method but complexity is always N log N.

    0 讨论(0)
提交回复
热议问题