Advertisement
szmelu

sortowanie

May 9th, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. #include <time.h>
  5. #include <iomanip>
  6.  
  7. #define N 10000
  8. #define NUM 13
  9. using namespace std;
  10. void wstaw(int tab[], int low, int high)
  11. {
  12. for (int i = low + 1; i <= high; i++)
  13. {
  14. int value = tab[i];
  15. int j = i;
  16.  
  17. // Znajdujemy element j w posortowanym podzbiorze
  18. // w którym znajduje się element tab[i]
  19. while (j > low && tab[j - 1] > value)
  20. {
  21. tab[j] = tab[j - 1];
  22. j--;
  23. }
  24. // tablica przesuwa się o jedną pozycje w prawo
  25.  
  26. tab[j] = value;
  27. }
  28. }
  29.  
  30. int Partition (int tab[], int low, int high)
  31. {
  32. // za q przyjmujemy ostatni element tablicy
  33. int q = tab[high];
  34.  
  35. // elementy mniejsze od q przesuwaja sie na lewo,
  36. // a elementy większe od q przesuwaja sie na prawo
  37. // równe elementy mogą iść i tu i tu
  38. int p = low;
  39.  
  40. // Za każdym razem, gdy znajdziemy element mniejszy lub równy q, p jest zwiększany i element zostanie umieszczony przed q
  41. for (int i = low; i < high; i++)
  42. {
  43. if (tab[i] <= q)
  44. {
  45. swap(tab[i], tab[p]);
  46. p++;
  47. }
  48. }
  49. // zamieniamy p i q
  50. swap (tab[p], tab[high]);
  51.  
  52. // zwracamy element łączący
  53. return p;
  54. }
  55.  
  56. void quicksort(int tab[], int low, int high)
  57. {
  58. // podstawowy warunek
  59. if (low >= high)
  60. return;
  61.  
  62. // przestawiamy elementy względem q
  63. int q = Partition(tab, low, high);
  64.  
  65. // rekurencyjnie dzielimy elementy które są mniejsze od q na coraz mniejsze podzbiory
  66. quicksort(tab, low, q - 1);
  67.  
  68. // rekurencyjnie dzielimy elementy któe są większe od q na coraz mniejsze podzbiory
  69. quicksort(tab, q + 1, high);
  70. }
  71. void hybrid(int tab[], int low, int high)
  72. {
  73. while (low < high)
  74. {
  75. // dla zbiorów mniejszych od 10 odrazu wykonujemy sortowanie przez wstawianie
  76. if (high - low < 10)
  77. {
  78. wstaw(tab, low, high);
  79. break;
  80. }
  81. else
  82. {
  83. int q = Partition(tab, low, high);
  84.  
  85. if (q - low < high - q) {
  86. hybrid(tab, low, q - 1);
  87. low = q + 1;
  88. } else {
  89. hybrid(tab, q + 1, high);
  90. high = q - 1;
  91. }
  92. }
  93. }
  94. }
  95. //sprawdzenie czy tablica jest posortowana, jeżeli nie to wyskoczy error
  96. bool isSorted(int tab[])
  97. {
  98. int prev = tab[0];
  99. for (int i = 1 ; i < N; i++)
  100. {
  101. if (prev > tab[i])
  102. {
  103. cout << "QuickSort Failed!!";
  104. return false;
  105. }
  106. prev = tab[i];
  107. }
  108.  
  109. return true;
  110. }
  111. int main()
  112. {
  113. srand(time(NULL));
  114. clock_t s, f;
  115. double czas = 0.0, czas2 = 0.0;
  116. int tablica[N], tablica2[N];
  117. for(int j=0; j<NUM;j++)
  118. {
  119. for (int i = 0; i < N; i++) // wczytywanie liczb do tablicy
  120. tablica[i]=tablica2[i]=rand()%N;
  121. s=clock();
  122. quicksort(tablica,0,N-1);
  123. f=clock();
  124. czas+=(double)(f-s)/CLOCKS_PER_SEC;
  125. s=clock();
  126. hybrid(tablica2, 0, N-1);
  127. f=clock();
  128. czas2+=(double)(f-s)/CLOCKS_PER_SEC;
  129. if (!isSorted(tablica))
  130. {
  131. cout << "ERRROR";
  132. }
  133. if (!isSorted(tablica2))
  134. {
  135. cout << "ERRROR2";
  136. }
  137. }
  138. cout<<endl;
  139. cout<<"quicksort: "<<czas/NUM<<endl;
  140. cout<<"hybrid: "<<czas2/NUM<<endl;
  141. system("pause");
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement