Advertisement
tantarin

VKbase1

May 22nd, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <math.h>
  2. #include <algorithm>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. void introsort_r(int a[], int first, int last, int depth);
  7. void _introsort(int a[], int n);
  8. int _partition(int a[], int first, int last);
  9. void _insertion(int a[], int n);
  10. void _swap(int *a, int *b);
  11. void _doheap(int a[], int begin, int end);
  12. void _heapsort(int a[], int begin, int end);
  13. bool _isSorted(int a[], int end);
  14.  
  15. void introsort_r(int a[], int first, int last, int depth){
  16. while(last - first > 0 ) {
  17. if(depth=0)
  18. _heapsort(&a[first], first, last-first+1 );
  19. else {
  20. int pivot;
  21. if( _isSorted(a, last))
  22. break;
  23. pivot = _partition(a, first, last);
  24. introsort_r(a, pivot+1, last, depth-1);
  25. last = pivot -1;
  26. }
  27. }
  28. }
  29.  
  30. void _introsort(int a[], int n){
  31. introsort_r ( a, 0, n-1, (int(2*log(double(n)))));
  32. _insertion(a, n);
  33. }
  34.  
  35. int _partition ( int a[], int first, int last){
  36. int pivot, mid = (first+last)/2;
  37.  
  38. pivot = a[first] > a[mid] ? first : mid;
  39.  
  40. if( a[pivot] > a[last])
  41. pivot = last;
  42.  
  43. _swap( &a[pivot], &a[first] );
  44. pivot = first;
  45.  
  46. while ( first < last ){
  47. if ( a[first] <= a[last] )
  48. _swap( &a[pivot++], &a[first] );
  49. ++first;
  50. }
  51.  
  52. _swap (&a[pivot], &a[last]);
  53. return pivot;
  54. }
  55.  
  56. void _insertion ( int a[], int n ) {
  57. int i;
  58. for ( i = 1; i < n; i++ ) {
  59. int j, save = a[i];
  60. for ( j = i; j >= 1 && a[j - 1] > save; j-- )
  61. a[j] = a[j - 1];
  62. a[j] = save;
  63. }
  64. }
  65.  
  66. void _swap(int *a, int *b){
  67. int save = *a;
  68. *a = *b;
  69. *b = save;
  70. }
  71. void _doheap(int a[], int begin, int end ){
  72. int save = a[begin];
  73. while (begin <= end /2) {
  74. int k = 2* begin;
  75. while ( k < end && a[k] <a[k+1])
  76. ++k;
  77. if( save >= a[k])
  78. break;
  79. a[begin] = a[k];
  80. begin = k;
  81. }
  82. a[begin] = save;
  83. }
  84.  
  85. void _heapsort(int a[], int begin, int end ){
  86. int i;
  87. for(int i = (end-1) / 2; i >= begin; i--){
  88. _doheap( a, i , end-1);
  89. }
  90. for( i=end-1; i>begin; i--){
  91. _swap( &a[i], &a[begin]);
  92. _doheap(a, begin, i-1);
  93. }
  94. }
  95. bool _isSorted(int a[], int end){
  96. for(int i=0; i<end; i++){
  97. if(a[i] > a[i+1]){
  98. return false;
  99. } else {
  100. return true;
  101. }
  102. }
  103. return true;
  104. }
  105. int main()
  106. {
  107. int k=0;
  108. int mas1[] = {8,2,1,4,5}; //1,2,4,5,8
  109.  
  110. int mas2[] = {4,2,5}; //2,4,5
  111.  
  112. _introsort(mas1, 5);
  113. _introsort(mas2, 3);
  114.  
  115.  
  116. int i = 0;
  117. int j = 0;
  118.  
  119. while (i<5 && j<3){
  120. if (mas1[i]<mas2[j]) i++;
  121. else if (mas1[i]>mas2[j]) j++;
  122. else {k++; i++; j++;};
  123. }
  124.  
  125. cout << "количество общих элементов = " << k<<endl;
  126. cout << "runtime = " << clock()/1000.0 << endl; // время работы программы
  127. return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement