test_insert_sort.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. //----------------------------------------------------------------------------
  2. /// @file test_insert_sort.cpp
  3. /// @brief Test program of the insert_sort algorithm
  4. ///
  5. /// @author Copyright (c) 2016 Francisco Jose 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 <iostream>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <time.h>
  18. #include <vector>
  19. #include <boost/sort/insert_sort/insert_sort.hpp>
  20. #include <boost/test/included/test_exec_monitor.hpp>
  21. #include <boost/test/test_tools.hpp>
  22. using namespace boost::sort;
  23. using namespace std;
  24. using boost::sort::common::util::insert_sorted;
  25. void test01 (void)
  26. {
  27. unsigned A[] = {7, 4, 23, 15, 17, 2, 24, 13, 8, 3, 11,
  28. 16, 6, 14, 21, 5, 1, 12, 19, 22, 25, 8};
  29. std::less< unsigned > comp;
  30. // Insertion Sort Unordered, not repeated
  31. insert_sort (&A[ 0 ], &A[ 22 ], comp);
  32. for (unsigned i = 0; i < 21; i++) {
  33. BOOST_CHECK (A[ i ] <= A[ i + 1 ]);
  34. };
  35. unsigned B[] = {1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12,
  36. 13, 14, 15, 17, 18, 19, 20, 21, 23, 24, 25};
  37. // Insertion Sort Ordered, not repeated
  38. insert_sort (&B[ 0 ], &B[ 22 ], comp);
  39. for (unsigned i = 0; i < 21; i++) {
  40. BOOST_CHECK (B[ i ] <= B[ i + 1 ]);
  41. };
  42. unsigned C[] = {27, 26, 25, 23, 22, 21, 19, 18, 17, 16, 15,
  43. 14, 13, 11, 10, 9, 8, 7, 6, 5, 3, 2};
  44. // Insertion Sort reverse sorted, not repeated
  45. insert_sort (&C[ 0 ], &C[ 22 ], comp);
  46. for (unsigned i = 0; i < 21; i++) {
  47. BOOST_CHECK (C[ i ] <= C[ i + 1 ]);
  48. };
  49. unsigned D[] = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  50. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4};
  51. // Insertion Sort equal elements
  52. insert_sort (&D[ 0 ], &D[ 22 ], comp);
  53. for (unsigned i = 0; i < 21; i++) {
  54. BOOST_CHECK (D[ i ] <= D[ i + 1 ]);
  55. };
  56. // Insertion Sort 100 random elements
  57. unsigned F[ 100 ];
  58. for (unsigned i = 0; i < 100; i++) F[ i ] = rand ( ) % 1000;
  59. insert_sort (&F[ 0 ], &F[ 100 ], comp);
  60. for (unsigned i = 0; i < 99; i++) {
  61. BOOST_CHECK (F[ i ] <= F[ i + 1 ]);
  62. };
  63. const unsigned NG = 10000;
  64. // Insertion Sort "<<NG<<" random elements
  65. unsigned G[ NG ];
  66. for (unsigned i = 0; i < NG; i++) G[ i ] = rand ( ) % 1000;
  67. insert_sort (&G[ 0 ], &G[ NG ], comp);
  68. for (unsigned i = 0; i < NG - 1; i++) {
  69. BOOST_CHECK (G[ i ] <= G[ i + 1 ]);
  70. };
  71. };
  72. void test02 (void)
  73. {
  74. typedef typename std::vector< uint64_t >::iterator iter_t;
  75. const uint32_t NELEM = 6667;
  76. std::vector< uint64_t > A;
  77. std::less< uint64_t > comp;
  78. for (uint32_t i = 0; i < 1000; ++i) A.push_back (0);
  79. for (uint32_t i = 0; i < NELEM; ++i) A.push_back (NELEM - i);
  80. for (uint32_t i = 0; i < 1000; ++i) A.push_back (0);
  81. insert_sort (A.begin ( ) + 1000, A.begin ( ) + (1000 + NELEM), comp);
  82. for (iter_t it = A.begin ( ) + 1000; it != A.begin ( ) + (1000 + NELEM);
  83. ++it)
  84. {
  85. BOOST_CHECK ((*(it - 1)) <= (*it));
  86. };
  87. BOOST_CHECK (A[ 998 ] == 0 and A[ 999 ] == 0 and A[ 1000 + NELEM ] == 0 and
  88. A[ 1001 + NELEM ] == 0);
  89. A.clear ( );
  90. for (uint32_t i = 0; i < 1000; ++i) A.push_back (999999999);
  91. for (uint32_t i = 0; i < NELEM; ++i) A.push_back (NELEM - i);
  92. for (uint32_t i = 0; i < 1000; ++i) A.push_back (999999999);
  93. insert_sort (A.begin ( ) + 1000, A.begin ( ) + (1000 + NELEM), comp);
  94. for (iter_t it = A.begin ( ) + 1001; it != A.begin ( ) + (1000 + NELEM);
  95. ++it)
  96. {
  97. BOOST_CHECK ((*(it - 1)) <= (*it));
  98. };
  99. BOOST_CHECK (A[ 998 ] == 999999999 and A[ 999 ] == 999999999 and
  100. A[ 1000 + NELEM ] == 999999999 and
  101. A[ 1001 + NELEM ] == 999999999);
  102. };
  103. void test03 ( void)
  104. {
  105. std::vector<uint32_t> V {1,3,5,2,4};
  106. std::less<uint32_t> comp ;
  107. uint32_t aux[10] ;
  108. insert_sorted ( V.begin() , V.begin()+3, V.end(), comp, aux);
  109. //insert_partial_sort ( V.begin() , V.begin()+3, V.end() , comp);
  110. for ( uint32_t i =0 ; i < V.size() ; ++i)
  111. std::cout<<V[i]<<", ";
  112. std::cout<<std::endl;
  113. V ={3,5,7,9,11,13,15,17,19,8,6,10,4,2};
  114. insert_sorted ( V.begin() , V.begin()+9, V.end() , comp, aux);
  115. //insert_partial_sort ( V.begin() , V.begin()+9, V.end() , comp);
  116. for ( uint32_t i =0 ; i < V.size() ; ++i)
  117. std::cout<<V[i]<<", ";
  118. std::cout<<std::endl;
  119. V ={13,15,17,19,21,23,35,27,29,8,6,10,4,2};
  120. insert_sorted ( V.begin() , V.begin()+9, V.end() , comp, aux);
  121. //insert_partial_sort ( V.begin() , V.begin()+9, V.end() , comp);
  122. for ( uint32_t i =0 ; i < V.size() ; ++i)
  123. std::cout<<V[i]<<", ";
  124. std::cout<<std::endl;
  125. V ={3,5,7,9,11,13,15,17,19,28,26,30,24,22};
  126. insert_sorted ( V.begin() , V.begin()+9, V.end() , comp, aux);
  127. //insert_partial_sort ( V.begin() , V.begin()+9, V.end() , comp);
  128. for ( uint32_t i =0 ; i < V.size() ; ++i)
  129. std::cout<<V[i]<<", ";
  130. std::cout<<std::endl;
  131. }
  132. int test_main (int, char *[])
  133. {
  134. test01 ( );
  135. test02 ( );
  136. test03 ( );
  137. return 0;
  138. }