Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.17 KB | None | 0 0
  1. #include<iostream>
  2. #include<Windows.h>
  3. #include <cstdlib>
  4. #include <ctime>
  5.  
  6. #define SIZE 20
  7. int tab[SIZE];
  8.  
  9. //deklaracja struktury sprawia, ze do nowego watku wystarczy przekazac jeden argument
  10. struct Indexes {
  11. int start;
  12. int end;
  13. };
  14.  
  15. //funkcja zapelniajaca podana tablice losowymi liczbami
  16. void fillWithRandom(int* table, int max){
  17. for (int i = 0; i < SIZE; i++){
  18. table[i] = rand() % max;
  19. }
  20. }
  21.  
  22. void Sort(int start, int end) {
  23. int centre = (start + end) / 2; //okreslanie srodka tablicy
  24.  
  25. int i = start, j = centre + 1, q = start;
  26. int tabtmp[SIZE];
  27.  
  28. for (int a = start; a <= end; a++)
  29. tabtmp[a] = tab[a];
  30.  
  31. //przepisywanie liczb z tablicy tymczasowej, do wlasciwej
  32. while (i <= centre && j <= end) {
  33. if (tabtmp[i] < tabtmp[j]){
  34. tab[q] = tabtmp[i];
  35. ++q; ++i;
  36. }else{
  37. tab[q] = tabtmp[j];
  38. ++q; ++j;
  39. }
  40. }
  41.  
  42. for (; i <= centre; ++q,++i){
  43. tab[q] = tabtmp[i];
  44. }
  45. }
  46.  
  47. DWORD WINAPI MergeSort(void *indexes) {
  48.  
  49. //rzutowanie z typu void
  50. Indexes *indexesTmp = (Indexes*) indexes;
  51.  
  52. if (indexesTmp->start >= indexesTmp->end) //jesli algorytm doszedl do konca tablicy, zakoncz
  53. return 0;
  54.  
  55. int centre = (indexesTmp->end + indexesTmp->start) / 2; //okreslanie srodka tablicy
  56. HANDLE h[2]; //deklaracja dojscia
  57. DWORD ThreadId; //id watku
  58.  
  59. Indexes leftIndex;
  60. HANDLE leftHandle;
  61. leftIndex = { indexesTmp->start, centre };
  62. leftHandle = CreateThread(NULL, 0, MergeSort, &leftIndex, 0, &ThreadId); //utworzenie watku dla pierwszej polowy
  63.  
  64. Indexes rightIndex;
  65. HANDLE rightHandle;
  66. rightIndex = { centre + 1, indexesTmp->end };
  67. rightHandle = CreateThread(NULL, 0, MergeSort, &rightIndex, 0, &ThreadId); //utworzenie watku dla drugiej polowy
  68.  
  69. //zapobiega bledom
  70. HANDLE handles[2] = { leftHandle, rightHandle };
  71. WaitForMultipleObjects(2, handles, TRUE, INFINITE);
  72.  
  73. //wywolanie funkcji sortujacej
  74. Sort(indexesTmp->start, indexesTmp->end);
  75.  
  76. return 0;
  77. }
  78.  
  79.  
  80. int main() {
  81. srand(time(NULL));
  82. fillWithRandom(tab,500);
  83. Indexes indexes = { 0, SIZE - 1 }; //okreslanie indeksow pozycji dla poczatkowej tablicy
  84. MergeSort(&indexes);
  85. for (int i = 0; i < SIZE; i++)
  86. std::cout << tab[i] << " ";
  87. getchar();
  88. return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement