Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. // Podstawy Informatyki
  2. // Zliczanie ilosci inwersji w podanej serii liczb.
  3.  
  4. #include <stdio.h>
  5.  
  6. // polaczIZliczaj 2 posortowane podtablice tab[lewa ... srodek] i tab[srodek + 1 ... prawa]
  7. int polaczIZliczaj(int tab[], int tmp[], int lewa, int srodek, int prawa)
  8. {
  9. int k = lewa, i = lewa, j = srodek + 1;
  10. int licznik_inwersji = 0;
  11.  
  12. // Wykonuj dopoki istnieja elementy w tablicy.
  13. while (i <= srodek && j <= prawa)
  14. {
  15. if (tab[i] <= tab[j]) {
  16. tmp[k++] = tab[i++];
  17. }
  18. else {
  19. tmp[k++] = tab[j++];
  20. licznik_inwersji += (srodek - i + 1);
  21. }
  22. }
  23.  
  24. // Kopiowanie.
  25. while (i <= srodek)
  26. tmp[k++] = tab[i++];
  27.  
  28.  
  29. for (int i = lewa; i <= prawa; i++)
  30. tab[i] = tmp[i];
  31.  
  32. return licznik_inwersji;
  33. }
  34.  
  35. // Posortuj tablice tab [lewa..prawa] wykorzystujac pomocnicza tablice tmp.
  36. int sortujIZliczaj(int tab[], int tmp[], int lewa, int prawa)
  37. {
  38. // Przypadek podstawowy - maly problem.
  39. if (prawa == lewa)
  40. return 0;
  41.  
  42. // Znajdz miejsce (indeks) podzialu tablicy.
  43. int srodek = (lewa + ((prawa - lewa) >> 1));
  44. int licznik_inwersji = 0;
  45.  
  46. // Dzielimy dopoki nie osiagniemy przypadku podstawowego,
  47. // a nastepnie scalamy.
  48.  
  49. licznik_inwersji += sortujIZliczaj(tab, tmp, lewa, srodek); // podziel na lewo
  50. licznik_inwersji += sortujIZliczaj(tab, tmp, srodek + 1, prawa); // podziel na prawo
  51. licznik_inwersji += polaczIZliczaj(tab, tmp, lewa, srodek, prawa); // polacz polowy
  52.  
  53. return licznik_inwersji;
  54. }
  55.  
  56. int main()
  57. {
  58. int tab[] = { 6, 2, 4, 1, 5, 3, 7, 8 };
  59.  
  60. int n = sizeof(tab)/sizeof(tab[0]);
  61.  
  62. int tmp[n];
  63. for (int i = 0; i < n; i++)
  64. tmp[i] = tab[i];
  65.  
  66. printf("Liczba inwersji: %d.", sortujIZliczaj(tab, tmp, 0, n - 1));
  67.  
  68. return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement