test_spinsort.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. //----------------------------------------------------------------------------
  2. /// @file test_spinsort.cpp
  3. /// @brief test program of the spinsort algorithm
  4. ///
  5. /// @author Copyright (c) 2016 Francisco José Tapia (fjtapia@gmail.com )\n
  6. /// Distributed under the Boost Software License, Version 1.0.\n
  7. /// ( See accompanying file LICENSE_1_0.txt or copy at
  8. /// http://www.boost.org/LICENSE_1_0.txt )
  9. /// @version 0.1
  10. ///
  11. /// @remarks
  12. //-----------------------------------------------------------------------------
  13. #include <ciso646>
  14. #include <algorithm>
  15. #include <iostream>
  16. #include <cstdio>
  17. #include <cstdlib>
  18. #include <ctime>
  19. #include <vector>
  20. #include <random>
  21. #include <boost/sort/spinsort/spinsort.hpp>
  22. #include <boost/test/included/test_exec_monitor.hpp>
  23. #include <boost/test/test_tools.hpp>
  24. using namespace boost::sort;
  25. using spin_detail::check_stable_sort;
  26. using spin_detail::range_sort;
  27. using common::range;
  28. void test1 ( );
  29. void test2 ( );
  30. void test3 ( );
  31. void test4 ( );
  32. //---------------- stability test -----------------------------------
  33. struct xk
  34. {
  35. unsigned tail : 4;
  36. unsigned num : 28;
  37. xk ( uint32_t n =0 , uint32_t t =0): tail (t), num(n){};
  38. bool operator< (xk A) const { return (num < A.num); };
  39. };
  40. void test1 ( )
  41. {
  42. typedef std::less< xk > compare_t;
  43. std::mt19937_64 my_rand (0);
  44. const uint32_t NMAX = 100000;
  45. std::vector< xk > V1, V2;
  46. V1.reserve (NMAX);
  47. for (uint32_t i = 0; i < 8; ++i) {
  48. for (uint32_t k = 0; k < NMAX; ++k) {
  49. uint32_t NM = my_rand ( );
  50. xk G;
  51. G.num = NM >> 3;
  52. G.tail = i;
  53. V1.push_back (G);
  54. };
  55. };
  56. V2 = V1;
  57. spinsort (V1.begin ( ), V1.end ( ), compare_t ( ));
  58. std::stable_sort (V2.begin ( ), V2.end ( ));
  59. BOOST_CHECK (V1.size ( ) == V2.size ( ));
  60. for (uint32_t i = 0; i < V1.size ( ); ++i) {
  61. BOOST_CHECK (V1[ i ].num == V2[ i ].num and
  62. V1[ i ].tail == V2[ i ].tail);
  63. };
  64. };
  65. void test2 (void)
  66. {
  67. typedef std::less< uint64_t > compare_t;
  68. const uint32_t NElem = 100000;
  69. std::vector< uint64_t > V1,V2;
  70. std::mt19937_64 my_rand (0);
  71. compare_t comp;
  72. // ------------------------ random elements -------------------------------
  73. for (uint32_t i = 0; i < NElem; ++i) V1.push_back (my_rand ( ) % NElem);
  74. V2 = V1;
  75. spinsort (V1.begin ( ), V1.end ( ), comp);
  76. std::stable_sort (V2.begin ( ), V2.end ( ), comp);
  77. for (unsigned i = 0; i < NElem; i++) {
  78. BOOST_CHECK (V2[ i ] == V1[ i ]);
  79. };
  80. // --------------------------- sorted elements ----------------------------
  81. V1.clear ( );
  82. for (uint32_t i = 0; i < NElem; ++i) V1.push_back (i);
  83. spinsort (V1.begin ( ), V1.end ( ), comp);
  84. for (unsigned i = 1; i < NElem; i++) {
  85. BOOST_CHECK (V1[ i - 1 ] <= V1[ i ]);
  86. };
  87. //-------------------------- reverse sorted elements ----------------------
  88. V1.clear ( );
  89. for (uint32_t i = 0; i < NElem; ++i) V1.push_back (NElem - i);
  90. spinsort (V1.begin ( ), V1.end ( ), comp);
  91. for (unsigned i = 1; i < NElem; i++) {
  92. BOOST_CHECK (V1[ i - 1 ] <= V1[ i ]);
  93. };
  94. //---------------------------- equal elements ----------------------------
  95. V1.clear ( );
  96. for (uint32_t i = 0; i < NElem; ++i) V1.push_back (1000);
  97. spinsort (V1.begin ( ), V1.end ( ), comp);
  98. for (unsigned i = 1; i < NElem; i++) {
  99. BOOST_CHECK (V1[ i - 1 ] == V1[ i ]);
  100. };
  101. };
  102. void test3 (void)
  103. {
  104. typedef typename std::vector<uint64_t>::iterator iter_t ;
  105. typedef range<iter_t> range_it ;
  106. std::less<uint64_t> comp ;
  107. std::vector<uint64_t> V = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19,
  108. 21, 23, 25, 27, 29, 31, 33, 35, 37, 39,
  109. 41, 43, 45, 47, 49, 51, 53, 55, 57, 59,
  110. 14, 2, 4, 6, 8, 10, 12, 16, 18, 20};
  111. range_it rdata (V.begin() , V.end());
  112. std::vector<uint64_t> aux (40,0 );
  113. range_it raux ( aux.begin() , aux.end());
  114. check_stable_sort ( rdata, raux, comp );
  115. for ( uint32_t i =0 ; i < V.size() ; ++i)
  116. std::cout<<V[i]<<", ";
  117. std::cout<<std::endl;
  118. V = {59, 57, 55, 53, 51, 49, 47, 45, 43, 41,
  119. 39, 37, 35, 33, 31, 29, 27, 25, 23, 21,
  120. 19, 17, 15, 13, 11, 9, 7, 5, 3, 1,
  121. 14, 2, 6, 16, 18, 20, 12, 4, 8, 10};
  122. rdata = range_it (V.begin() , V.end());
  123. aux.assign (40,0);
  124. raux = range_it ( aux.begin() , aux.end());
  125. check_stable_sort ( rdata, raux, comp );
  126. for ( uint32_t i =0 ; i < V.size() ; ++i)
  127. std::cout<<V[i]<<", ";
  128. std::cout<<std::endl;
  129. }
  130. void test4 (void)
  131. {
  132. typedef typename std::vector<xk>::iterator iter_t;
  133. typedef std::less<xk> compare_t;
  134. std::mt19937 my_rand (0);
  135. std::vector<xk> V ;
  136. const uint32_t NELEM = 100000;
  137. V.reserve(NELEM * 10);
  138. for (uint32_t k =0 ; k < 10 ; ++k)
  139. { for ( uint32_t i =0 ; i < NELEM ; ++i)
  140. { V.emplace_back(i , k);
  141. };
  142. iter_t first = V.begin() + (k * NELEM);
  143. iter_t last = first + NELEM ;
  144. std::shuffle( first, last, my_rand);
  145. };
  146. spinsort( V.begin() , V.end(), compare_t());
  147. for ( uint32_t i =0 ; i < ( NELEM * 10); ++i)
  148. { BOOST_CHECK ( V[i].num == (i / 10) and V[i].tail == (i %10) );
  149. };
  150. }
  151. int test_main (int, char *[])
  152. {
  153. test1 ( );
  154. test2 ( );
  155. test3 ( );
  156. test4 ( );
  157. return 0;
  158. };