#include <bits/stdc++.h> #include "teatr.h" #include "message.h" using namespace std; int sortowanie(int tab[], int tmp[], int poc, int kon); int zlacz(int tab[], int tmp[], int poc, int sro, int kon); int MergeSort(int tab[], int rozmiar) { int* tmp = (int*)malloc(sizeof(int) * rozmiar); return sortowanie(tab, tmp, 0, rozmiar - 1); } int sortowanie(int tab[], int tmp[], int poc, int kon) { int sro, wynik = 0; if(kon > poc) { sro = (kon + poc) / 2; wynik = sortowanie(tab, tmp, poc, sro); wynik += sortowanie(tab, tmp, sro + 1, kon); wynik += zlacz(tab, tmp, poc, sro + 1, kon); } return wynik; } int zlacz(int tab[], int tmp[], int poc, int sro, int kon) { int i, j, k, wynik = 0; i = poc; j = sro; k = poc; while(i <= sro - 1 && j <= kon) { if(tab[i] <= tab[j]) tmp[k++] = tab[i++]; else { tmp[k++] = tab[j++]; wynik = wynik + (sro - i); } } while(i <= sro - 1) tmp[k++] = tab[i++]; while(j <= kon) tmp[k++] = tab[j++]; for (i = poc; i <= kon; i++) tab[i] = tmp[i]; return wynik; } int main() { if(MyNodeId() == 0) { int n = GetN(); int tab[n]; for(int i=0; i < n; i++) tab[i] = GetElement(i); int wynik = MergeSort(tab, n); cout<<wynik<<endl; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include <bits/stdc++.h> #include "teatr.h" #include "message.h" using namespace std; int sortowanie(int tab[], int tmp[], int poc, int kon); int zlacz(int tab[], int tmp[], int poc, int sro, int kon); int MergeSort(int tab[], int rozmiar) { int* tmp = (int*)malloc(sizeof(int) * rozmiar); return sortowanie(tab, tmp, 0, rozmiar - 1); } int sortowanie(int tab[], int tmp[], int poc, int kon) { int sro, wynik = 0; if(kon > poc) { sro = (kon + poc) / 2; wynik = sortowanie(tab, tmp, poc, sro); wynik += sortowanie(tab, tmp, sro + 1, kon); wynik += zlacz(tab, tmp, poc, sro + 1, kon); } return wynik; } int zlacz(int tab[], int tmp[], int poc, int sro, int kon) { int i, j, k, wynik = 0; i = poc; j = sro; k = poc; while(i <= sro - 1 && j <= kon) { if(tab[i] <= tab[j]) tmp[k++] = tab[i++]; else { tmp[k++] = tab[j++]; wynik = wynik + (sro - i); } } while(i <= sro - 1) tmp[k++] = tab[i++]; while(j <= kon) tmp[k++] = tab[j++]; for (i = poc; i <= kon; i++) tab[i] = tmp[i]; return wynik; } int main() { if(MyNodeId() == 0) { int n = GetN(); int tab[n]; for(int i=0; i < n; i++) tab[i] = GetElement(i); int wynik = MergeSort(tab, n); cout<<wynik<<endl; } return 0; } |