Advertisement
everloongg

Untitled

Dec 10th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1.  
  2.  
  3. void MergeSortOneTab( int* pTab, int l, int r)
  4. {
  5.     if( l < r )
  6.     {
  7.         int m = ( l + r ) / 2;
  8.  
  9.         MergeSortOneTab( pTab, l, m );
  10.         MergeSortOneTab( pTab, m + 1, r );
  11.         MergeOne( pTab, l, r);
  12.     }
  13.  
  14. }
  15.  
  16. void MergeOne( int* pTab, int start, int end)
  17. {
  18.     int size = end - start + 1;
  19.     int* temp = NULL; //tworze tablice tymczasowa
  20.     CreateT( &temp, size );
  21.     //kopiuje dane do tab tymczasowej
  22.     for( int v = 0; v < size; v++ )
  23.         *( temp + v ) = *( pTab + start + v );
  24.        
  25.     int i = 0;
  26.     int j = ( size + 1 ) / 2; //==m
  27.     int k = start;  //indeks tablicy do ktorej bedziemy wczytywac posortowane rosnaco dwa podciagi
  28.  
  29.     while(( i <= ( size + 1 ) / 2 ) && ( j < size )) // przenoszenie posortowanych danych z tablicy pomocniczej do tablicy glownej
  30.     {
  31.         //if(*( temp + i ) <= *( temp + j ))
  32.         if (temp[i] <= temp[j])
  33.         {
  34.             //  *( pTab + k++ ) = *( temp + i++ );
  35.             pTab[k++] = temp[i++];
  36.         }
  37.  
  38.         else
  39.             //*( pTab + k++ ) = *( temp + j++ );
  40.             pTab[k++] = temp[j++];
  41.  
  42.     }
  43.  
  44.     while (i < (size + 1) / 2)
  45.         //*( pTab + k++ ) = *( temp + i++ );
  46.         pTab[k++] = temp[i++];
  47.  
  48.     while (j < size)
  49.         //*( pTab + k++ ) = *( temp + j++ );
  50.         pTab[k++] = temp[j++];
  51.     free( temp );
  52. }
  53.  
  54. //==========================================
  55.  
  56.  
  57. void MergeSortTab(int* tab, int l, int r, int nSize, int* temp)
  58. {
  59.     if (l < r) {
  60.  
  61.  
  62.         int m = (l + r) / 2;
  63.  
  64.  
  65.         MergeSortTab(tab, l, m, nSize, temp);
  66.         MergeSortTab(tab, m + 1, r, nSize, temp);
  67.         Merge(tab, l, m, r, nSize, temp);
  68.     }
  69. }
  70. void Merge(int* tab, int l, int m, int r, int nSize, int* temp)
  71. {
  72.     memcpy(temp + l, tab + l, sizeof(int) * (r - l + 1)); // kopiujemy zawartość
  73.     int i = l; // początek pierwszego posortowanego ciągu
  74.     int j = m + 1; // początek drugiego posortowanego ciągu
  75.     int k = l; // indeks tablicy do którego bedziemy wczytywać posrtowane rosnąco dwa podciągu
  76.  
  77.     while (i <= m && j <= r) // łączenie dwóch posortowanych podciągów
  78.     {
  79.         if (temp[i] <= temp[j])
  80.         {
  81.             tab[k] = temp[i++];
  82.         }
  83.         else
  84.         {
  85.             tab[k] = temp[j++];
  86.         }
  87.         k++;
  88.     }
  89.     memcpy(tab + k, temp + i, (m - i + 1) * sizeof(int)); // dokopiowywanie reszty
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement