Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstdlib>
  4. #include <time.h>
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.     const int N = 5;  // liczebność zbioru
  11.     int d[N + 1], i, j, k, m, x; //d[ ]     - Zbiór zawierający elementy do wstawienia do kopca. Numeracja elementów rozpoczyna się od 1.
  12.     /*i - zmienna licznikowa pętli umieszczającej kolejne elementy zbioru w kopcu, i nldo. N, i nldo.{ 2,3,...,n }
  13.         j, k - indeksy elementów leżących na ścieżce od wstawianego elementu do korzenia, j, k nldo. C
  14.         x - zmienna pomocnicza przechowująca tymczasowo element wstawiany do kopca*/
  15.     srand((unsigned)time(NULL));
  16.  
  17.     for (i = 1; i <= N; i++)
  18.     {
  19.         d[i] = rand() % 100; cout << setw(4) << d[i];
  20.     }
  21.     cout << endl;
  22.  
  23.     // Budujemy kopiec
  24.  
  25.     for (i = 2; i <= N; i++) // zaczynamy od 2 bo 1 i tak zostanie na swoim miejscu
  26.     {
  27.         j = i; k = j / 2; //wskaźnik na poprzedni indeks i z tego porównujemy wartości
  28.         x = d[i]; // zapamietuje wskazany element
  29.         while ((k > 0) && (d[k] < x)) // dopoki k nie rowna sie 0 albo przodek nie jest wiekszy od x
  30.         {
  31.             d[j] = d[k];
  32.             j = k; k = j / 2;
  33.         }
  34.         d[j] = x;
  35.     }
  36.  
  37.      /*Rozbieramy kopiec*/
  38.  
  39.     for (i = N; i > 1; i--)
  40.     {
  41.         swap(d[1], d[i]); // zamiana korzenia z ostatnią wartością
  42.         j = 1; k = 2; //j - indeks przodka, k - indeks lewego potomka, petla konczy sie gdy j nie posiada potomkow
  43.         while (k < i) // wykonuje się, dopóki nie dojdziemy do końca zbioru
  44.         {
  45.             if ((k + 1 < i) && (d[k + 1] > d[k])) //sprawdzenie warunku kopca
  46.                 m = k + 1;
  47.             else
  48.                 m = k;
  49.             if (d[m] <= d[j]) break; // sprawdzenie warunku kopca
  50.             swap(d[j], d[m]);//brak zachowania warunku kopca, zamieniamy przodek z największym potomkiem
  51.             j = m; k = j + j; // przyjmujemy za m wezel nadrzedny, wyznaczamy indeks lewego potomka w k i kontynuujemy petle
  52.         }
  53.     }
  54.  
  55.     cout << "Po sortowaniu:\n\n";
  56.     for (i = 1; i <= N; i++) cout << setw(4) << d[i];
  57.     cout << endl;
  58.     system("PAUSE");
  59.     return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement