summaryrefslogtreecommitdiff
path: root/boost/sort/insert_sort/insert_sort.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/sort/insert_sort/insert_sort.hpp')
-rw-r--r--boost/sort/insert_sort/insert_sort.hpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/boost/sort/insert_sort/insert_sort.hpp b/boost/sort/insert_sort/insert_sort.hpp
new file mode 100644
index 0000000000..d40302ad10
--- /dev/null
+++ b/boost/sort/insert_sort/insert_sort.hpp
@@ -0,0 +1,119 @@
+//----------------------------------------------------------------------------
+/// @file insert_sort.hpp
+/// @brief Insertion Sort algorithm
+///
+/// @author Copyright (c) 2016 Francisco Jose Tapia (fjtapia@gmail.com )\n
+/// Distributed under the Boost Software License, Version 1.0.\n
+/// ( See accompanying file LICENSE_1_0.txt or copy at
+/// http://www.boost.org/LICENSE_1_0.txt )
+/// @version 0.1
+///
+/// @remarks
+//-----------------------------------------------------------------------------
+#ifndef __BOOST_SORT_INTROSORT_DETAIL_INSERT_SORT_HPP
+#define __BOOST_SORT_INTROSORT_DETAIL_INSERT_SORT_HPP
+
+#include <functional>
+#include <iterator>
+#include <algorithm>
+#include <utility> // std::swap
+#include <boost/sort/common/util/traits.hpp>
+#include <boost/sort/common/util/insert.hpp>
+
+namespace boost
+{
+namespace sort
+{
+using common::util::compare_iter;
+using common::util::value_iter;
+//
+//-----------------------------------------------------------------------------
+// function : insert_sort
+/// @brief : Insertion sort algorithm
+/// @param first: iterator to the first element of the range
+/// @param last : iterator to the next element of the last in the range
+/// @param comp : object for to do the comparison between the elements
+/// @remarks This algorithm is O(N^2)
+//-----------------------------------------------------------------------------
+template < class Iter_t, typename Compare = compare_iter < Iter_t > >
+static void insert_sort (Iter_t first, Iter_t last,
+ Compare comp = Compare())
+{
+ //--------------------------------------------------------------------
+ // DEFINITIONS
+ //--------------------------------------------------------------------
+ typedef value_iter< Iter_t > value_t;
+
+ if ((last - first) < 2) return;
+
+ for (Iter_t it_examine = first + 1; it_examine != last; ++it_examine)
+ {
+ value_t Aux = std::move (*it_examine);
+ Iter_t it_insertion = it_examine;
+
+ while (it_insertion != first and comp (Aux, *(it_insertion - 1)))
+ {
+ *it_insertion = std::move (*(it_insertion - 1));
+ --it_insertion;
+ };
+ *it_insertion = std::move (Aux);
+ };
+};
+
+/*
+//
+//-----------------------------------------------------------------------------
+// function : insert_partial_sort
+/// @brief : Insertion sort of elements sorted
+/// @param first: iterator to the first element of the range
+/// @param mid : last pointer of the sorted data, and first pointer to the
+/// elements to insert
+/// @param last : iterator to the next element of the last in the range
+/// @param comp : object for to do the comparison between the elements
+/// @remarks This algorithm is O(N^2)
+//-----------------------------------------------------------------------------
+template < class Iter_t, typename Compare = compare_iter < Iter_t > >
+void insert_partial_sort (Iter_t first, Iter_t mid, Iter_t last,
+ Compare comp = Compare())
+{
+ //--------------------------------------------------------------------
+ // DEFINITIONS
+ //--------------------------------------------------------------------
+ typedef value_iter< Iter_t > value_t;
+
+ if ( mid == last ) return ;
+ insert_sort ( mid, last, comp);
+ if (first == mid) return ;
+
+ // creation of the vector of elements to insert and their position in the
+ // sorted part
+ std::vector<Iter_t> viter ;
+ std::vector<value_t> vdata ;
+
+ for ( Iter_t alpha = mid ; alpha != last ; ++alpha)
+ vdata.push_back ( std::move ( *alpha));
+
+ Iter_t linf = first , lsup = mid ;
+ for ( uint32_t i= 0 ; i < vdata.size() ; ++i)
+ { Iter_t it1 = std::upper_bound ( linf, lsup , vdata[i], comp);
+ viter.push_back ( it1 );
+ linf = it1 ;
+ };
+
+ // moving the elements
+ viter.push_back ( mid) ;
+ for ( uint32_t i = viter.size() -1 ; i!= 0 ; --i)
+ { Iter_t src = viter[i], limit = viter[i-1];
+ Iter_t dest = src + ( i);
+ while ( src != limit) * (--dest) = std::move ( *(--src));
+ *(viter[i-1] + (i -1)) = std::move (vdata[i-1]);
+ };
+}
+*/
+//
+//****************************************************************************
+}; // End namespace sort
+}; // End namespace boost
+//****************************************************************************
+//
+#endif