Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <vector>
- #include <iostream>
- using namespace std;
- #pragma argsused
- struct dane
- {
- int index_poczatek;
- int index_koniec;
- };
- DWORD WINAPI merge_sort(void* argumenty);
- const int MAX = 20;
- int tablica[MAX];
- DWORD id;
- int main(int argc, char **argv)
- {
- struct dane* bogdan = new dane;
- bogdan->index_koniec = MAX-1;
- bogdan->index_poczatek = 0;
- srand(time(NULL));
- for(int i=0; i<MAX; i++)
- tablica[i]=rand()%1000;
- for(int i=0; i<MAX; i++)
- {
- cout << tablica[i] << " ";
- }
- cout << "\n";
- HANDLE watek;
- watek = CreateThread( NULL, 0, merge_sort, (void*)bogdan, 0, &id);
- WaitForSingleObject(watek, INFINITE);
- for(int i=0; i<MAX; i++)
- {
- cout << tablica[i] << " ";
- }
- cout << "\n";
- return 0;
- }
- DWORD WINAPI merge_sort(void* argumenty)
- {
- //struct dane* bogdan = new dane;
- struct dane* bogdan = (struct dane*)argumenty;
- //deklaruj strukta i z nim wywolaj nowy watek, derp
- struct dane* lewy;
- struct dane* prawy;
- int poczatek = bogdan->index_poczatek;
- int koniec= bogdan->index_koniec;
- int n=koniec-poczatek+1;
- int *tab_lewa, *tab_prawa;
- HANDLE lewy_watek, prawy_watek;
- if(poczatek<koniec)
- {
- lewy=new dane;
- prawy = new dane;
- lewy->index_poczatek = poczatek;
- lewy->index_koniec = (poczatek+koniec)/2;
- prawy->index_poczatek = lewy->index_koniec + 1;
- prawy->index_koniec = koniec;
- lewy_watek = CreateThread( NULL, 0, merge_sort, (void*)lewy, 0, &id);
- prawy_watek = CreateThread(NULL,0, merge_sort, (void*)prawy,0, &id);
- WaitForSingleObject(lewy_watek, INFINITE);
- WaitForSingleObject(prawy_watek, INFINITE);
- int n1, n2;
- n1 = (poczatek+koniec)/2 - poczatek + 1;
- n2 = koniec - (poczatek+koniec)/2;
- tab_lewa = new int[n1];
- tab_prawa = new int[n2];
- for(int i=0; i<n1; i++)
- tab_lewa[i] = tablica[poczatek + i];
- for(int i=0; i<n2; i++)
- tab_prawa[i]=tablica[(poczatek+koniec)/2 + 1 + i];
- //merdżujmey z tablic lewej i prawej do wlasciwej
- int i,k,j;
- for(k=i=j=0; k<n; k++)
- {
- if(i>= n1 || (j <n2 && tab_lewa[i] > tab_prawa[j]))
- tablica[k+poczatek] = tab_prawa[j++];
- else
- tablica[k+poczatek] = tab_lewa[i++];
- }
- free(tab_lewa);
- free(tab_prawa);
- free(lewy);
- free(prawy);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement