рддреЗрдЬреА рд╕реЗ рдЫрдВрдЯрдиреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдзреАрдореА рдХреНрдпреЛрдВ рд╣реИ? рдирдИ рдРрд░реЗ рд╕реЙрд░реНрдЯ рд╡рд┐рдзрд┐

рдЫрд╡рд┐ рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд╡рд┐рдХ рд╕реЙрд░реНрдЯ рд╕рднреА рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╣реИред рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╕рдорд░реНрдерди рддрддреНрд╡ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ ( рдлрд┐рд░ рдЬрдЯрд┐рд▓рддрд╛ рдУ рд╣реИ (рдПрди рд▓реЙрдЧ рдПрди) )ред рдЕрдиреНрдпрдерд╛, рд╕реНрдкрд░реНрд╢реЛрдиреНрдореБрдЦ рд╡реНрдпрд╡рд╣рд╛рд░ рд▓рдЧрднрдЧ рдмреБрд▓рдмреБрд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ ( рдпрд╛рдиреА, рдУ (рдПрди 2 ) )ред
рдЙрд╕реА рд╕рдордп, рдпрджрд┐ рд╕рд░рдгреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд░рдордмрджреНрдз рд╣реИ, рддреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрднреА рднреА рдУ (рдПрди рд▓реЙрдЧ рдПрди) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред


рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ quick_sort рд╕реЗ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рд╕рд░рдгреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЙрд░реНрдЯ рдХреА рдЧрдИ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрд╛рд░ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рди рдЪрд▓рд╛рдПрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдХрдИ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИред

"рдпрд╣ рд╢рд╛рдо рдереА, рд╡рд╣рд╛рдБ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдирд╛ рдерд╛," рд╕рд░реНрдЧреЗрдИ рдорд┐рдЦрд╛рд▓рдХреЛрд╡ред

рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ:


  1. рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рд╣реЗ (рдПрди)
  2. рдУ рдХрд╛ рдФрд╕рдд рдорд╛рдорд▓рд╛ (рдПрди рд▓реЙрдЧ рдПрди)
  3. рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рд╣реЗ (рдПрди рд▓реЙрдЧ рдПрди)
  4. рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдФрд╕рдд рдкрд░


рдЕрдм рдЪрд▓реЛ рдпрд╣ рд╕рдм рдХреНрд░рдо рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ


рд╣рдорд╛рд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдФрд╕рдд рдорд╛рдорд▓реЗ рдореЗрдВ рдПрд╕рд┐рдореНрдкреНрдЯреЛрдЯрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрдо рд╕реЗ рдХрдо рдУ (рдПрди рд▓реЙрдЧ рдПрди), рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛, рдУ (рдПрди) рдкрд░ рд╣реЛред рд╣рдо рд╕рднреА рдЗрд╕ рдмрд╛рдд рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐, рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ, рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд░реВрдк рд╕реЗ, рдЙрд╕реЗ рдХрдИ рдмрд╛рд░ рд╕рд░рдгреА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдбреНрд░рд╛рдЗрд╡ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рддрддреНрд╡ рд╣реИрдВред



рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА


рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд▓рдп рдХрд╛ рдХрд╛рд░реНрдп
int* glue(int* a, int lenA, int* b, int lenB) { int lenC = lenA + lenB; int* c = new int[lenC]; //   int indx_a = 0; int indx_b = 0; int i = 0; for (; i < lenC; ++i) { if (indx_a < lenA) { if (indx_b < lenB) { //     c[i] = (a[indx_a] < b[indx_b]) ? a[indx_a++] : b[indx_b++]; continue; } //      while (indx_a < lenA) c[i++] = a[indx_a++]; } else //      while (indx_b < lenB) c[i++] = b[indx_b++]; break; } return c; } 


рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд▓рдп рдХрд╛ рдХрд╛рд░реНрдп, рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдХ рдкрд░ рдмрдЪрд╛рддрд╛ рд╣реИред
 void glueDelete(int*& arr, int*& a, int lenA, int*& b, int lenB) { if (lenA == 0) { //    delete[] a; //     arr = b; //     return; } if (lenB == 0) { //    delete[] b; //     arr = a; //     return; } int *copy = glue(a, lenA, b, lenB); //  delete[]a; //    delete[]b; //    arr = copy; //   } 


рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд▓реЛ рдФрд░ рд╣рд╛рдп рдХреЗ рдмреАрдЪ рдЖрд╡реЗрд╖рдг рджреНрд╡рд╛рд░рд╛ рдЫрдБрдЯрд╛рдИ рдХрд░рддрд╛ рд╣реИ
 void insertionSort(int*& arr, int lo, int hi) { for (int i = lo + 1; i <= hi; ++i) for (int j = i; j > 0 && arr[j - 1] > arr[j]; --j) swap(arr[j - 1], arr[j]); } 

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг (рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ):


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдЕрдзрд┐рдХрддрдо (рдФрд░ рдиреНрдпреВрдирддрдо) рдХреЗ рд▓рд┐рдП рддрдерд╛рдХрдерд┐рдд рдЦреЛрдЬ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рд╕рд░рдгреА рд╕реЗ рдПрдХ рддрддреНрд╡ рдЪреБрдиреЗрдВред рдпрджрд┐ рдпрд╣ рдкрд┐рдЫрд▓реЗ рдЕрдзрд┐рдХрддрдо рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдЗрд╕ рддрддреНрд╡ рдХреЛ рдЪрдпрди рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдЕрдиреНрдпрдерд╛, рдпрджрд┐ рдпрд╣ рдкрд┐рдЫрд▓реЗ рдиреНрдпреВрдирддрдо рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рддрддреНрд╡ рдХреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдПрдХ рдЕрд▓рдЧ рд╕рд░рдгреА рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ред


рдЗрдирдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдФрд░ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддрд╛ рд╣реИ


 void FirstNewGeneratingSort(int*& arr, int len) 

рд╕рд░рдгреА (рд╣рдорд╛рд░реЗ рдЙрдЪреНрдЪ рдФрд░ рдЪрдврд╝рд╛рд╡) рдФрд░ рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рд╕реЗ рдПрдХ рдирдореВрдирд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ


 int* selection = new int[len << 1]; //     new int[len * 2] int left = len - 1; //       int right = len; //       int* restElements = new int[len]; //  ,      int restLen = 0; //      

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдЕрдкрдиреЗ рдореВрд▓ рд╕рд░рдгреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирдореВрдиреЗ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рд╣реИред рдпрд╣ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓рд╛ рддрддреНрд╡ рдПрдХ рдирдпрд╛ рдЕрдзрд┐рдХрддрдо рд╣реЛрдЧрд╛ред рддрдм рдирдореВрдирд╛ рд╕рд░рдгреА рдХреЗ рдХреЗрд╡рд▓ рджреВрд╕рд░реЗ рднрд╛рдЧ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд (рдпрджрд┐ рдЕрд╡рд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рдХреНрд░рдордмрджреНрдз рд╣реЛ)ред


рдирдореВрдирд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмрд╕ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ


 if (arr[0] > arr[1]) swap(arr[0], arr[1]); selection[left--] = arr[0]; selection[right++] = arr[1]; 

рдЦреБрдж рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдирд╛


 for (int i = 2; i < len; ++i) { if (selection[right - 1] <= arr[i]) //     { selection[right++] = arr[i]; continue; } if (selection[left + 1] >= arr[i]) //     { selection[left--] = arr[i]; continue; } restElements[restLen++] = arr[i]; //      ,    } 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рд╕реЙрд░реНрдЯ рд╕реЗрдЯ рд╣реИ, рдФрд░ "рд╢реЗрд╖" рддрддреНрд╡ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдЕрднреА рднреА рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдХреБрдЫ рдореЗрдореЛрд░реА рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрдореГрддрд┐ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдВ


 int selectionLen = right - left - 1; //   int* copy = glue(selection + left + 1, selectionLen, nullptr, 0); //       delete[] selection; //   2 * len ,         ,     selection = copy; //  ,    selection     delete[] arr; //    ,         ,       

рд╢реЗрд╖ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕реЙрд░реНрдЯ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЪрдпрди рдХреЗ рд╕рд╛рде рдорд░реНрдЬ рдХрд░реЗрдВ


 FirstNewGeneratingSort(restElements, restLen); glueDelete(arr, selection, selectionLen, restElements, restLen); 

рд╕рднреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛрдб (рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рд╕рдВрд╕реНрдХрд░рдг)
 void FirstNewGeneratingSort(int*& arr, int len) { if (len < 2) return; int* selection = new int[len << 1]; int left = len - 1; int right = len; int* restElements = new int[len]; int restLen = 0; if (arr[0] > arr[1]) swap(arr[0], arr[1]); selection[left--] = arr[0]; selection[right++] = arr[1]; for (int i = 2; i < len; ++i) { if (selection[right - 1] <= arr[i]) //     { selection[right++] = arr[i]; continue; } if (selection[left + 1] >= arr[i]) //     { selection[left--] = arr[i]; continue; } restElements[restLen++] = arr[i]; //      ,    } int selectionLen = right - left - 1; //   int* copy = glue(selection + left + 1, selectionLen, nullptr, 0); //       delete[] selection; //   2 * len ,          ,     selection = copy; //  ,    selection     delete[] arr; //    ,         ,       FirstNewGeneratingSort(restElements, restLen); glueDelete(arr, selection, selectionLen, restElements, restLen); } 


рдЖрдЗрдП рдХреНрд╡рд┐рдХ рд╕реЙрд░реНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЧрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ


рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗред QuickSort рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 6 рдЧреБрдирд╛ рд▓рдВрдмрд╛! рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдиреБрдЪрд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдБ рдпрд╣ рдЕрд╕реНрдорд┐рддрд╛рд╡рд╛рджреА рд╣реИ рдЬреЛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрд╣рд▓рд╛ рдФрд░ рджреВрд╕рд░рд╛ рддрддреНрд╡ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рд╣реЛрдЧрд╛ред рдФрд░ рдмрд╛рдХреА рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕рд░рдгреА рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЬрдЯрд┐рд▓рддрд╛:


  • рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐: O (n 2 )
  • рдордзреНрдп рдХрд╛ рдорд╛рдорд▓рд╛: O (n 2 )
  • рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛: O (n)

рд╣рдореНрдо, рдпрд╣ рдЖрд╡реЗрд╖рдг рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рди рдЫрдВрдЯрдиреА рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реИред рд╣рд╛рдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдЕрдзрд┐рдХрддрдо (рдиреНрдпреВрдирддрдо) рддрддреНрд╡ рдмрд╣реБрдд рдЬрд▓реНрджреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдХреА рдмрд╕ рдЪрдпрди рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдВрдЧреЗред


рд╣рдо рдорд░реНрдЬ рд╕реЙрд░реНрдЯ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд╛рдорд╛рдиреНрдп рдорд░реНрдЬ рд╕реЙрд░реНрдЯ рдХреА рдЧрддрд┐ рдЬрд╛рдВрдЪреЗрдВ:


рдЫрд╡рд┐

рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп рдкреНрд░рдХрд╛рд░:
 void newGenerationMergeSort(int* a, int lo, int hi, int& minPortion) { if (hi <= lo) return; int mid = lo + (hi - lo) / 2; if (hi - lo <= minPortion) { //       ,     int* part = glue(a + lo, hi - lo + 1, nullptr, 0); //    FirstNewGeneratingSort(part, hi - lo + 1); for (int i = lo; i <= hi; ++i) { a[i] = part[i - lo]; } delete[] part; return; } newGenerationMergeSort(a, lo, mid, minPortion); newGenerationMergeSort(a, mid + 1, hi, minPortion); int* b = glue(a + lo, mid - lo + 1, a + mid + 1, hi - mid); for (int i = lo; i <= hi; i++) a[i] = b[i - lo]; delete[] b; } 


рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


 void newMergeSort(int *arr, int length) { int portion = log2(length); //      portion *= portion; newGenerationMergeSort(arr, 0, length - 1, portion); } 

рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо:


рдЫрд╡рд┐

рд╣рд╛рдВ, рдЧрддрд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐ рджреЗрдЦреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреНрд╡рд┐рдХ рд╕реЙрд░реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ O (n) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рднреА рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдХрд▓реНрдк


  1. рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдУ (рдПрди 2 ) рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ 1 рд╕рд░рдгреА рдореЗрдВ рдирд╣реАрдВ рдереЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ 2 рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓ рдЗрди рджреЛ рднрд╛рдЧреЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рдорд░реНрдЬ рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ O рдХреЗ рдмрд░рд╛рдмрд░ рдЬрдЯрд┐рд▓рддрд╛ рдорд┐рд▓рддреА рд╣реИ (n log n)

  2. рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ, рдХреНрд░рдордмрджреНрдз рд╕рд░рдгреА рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдзрд┐рдХрддрдо (рдиреНрдпреВрдирддрдо) рддрддреНрд╡ рдХрд╛рдлреА рдЬрд▓реНрджреА рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд╣рдорд╛рд░реА рдорджрдж рдХреЗ рд▓рд┐рдП рдЖрддреА рд╣реИред рдЪрдпрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рд╣рдо рдЬрд╛рдБрдЪреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдкреНрд░рд╡рд╛рд╣ рддрддреНрд╡ рдХреЛ рдЕрдВрддрд┐рдо рдХреЗ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрда рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реИрдВред


рдпрджрд┐ рдпрд╣ рдЕрднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд░реЗрд╢рд╛рди рди рд╣реЛрдВред рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдм рдХреЛрдб рдкрд░ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреНрд░рд╢реНрди рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЕрд╡рд╢рд┐рд╖реНрдЯ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг:


рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддрд░рд╣ рд╣реА рд╣реИ


 void newGenerationSort(int*& arr, int len) 

рд▓реЗрдХрд┐рди рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЛ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдорд╛рдирддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдбрд┐рд▓реАрдЯ [] рдСрдкрд░реЗрд╢рди рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВ - рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ)ред рдпрд╣реА рд╣реИ, рдЬрдм рд╣рдордиреЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА, рддреЛ рд╣рдордиреЗ рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдкрддрд╛ рд╕реМрдВрдкрд╛ред


рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддреИрдпрд╛рд░реА


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рддрдерд╛рдХрдерд┐рдд "рдХреИрдЪ рдЕрдк рдЧреБрдгрд╛рдВрдХ" рдХреЗрд╡рд▓ 8 рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд┐рд░ рд╣реИред рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рддрдиреЗ рдирдП "рдЕрдВрдбрд░-рдореИрдХреНрд╕рд┐рдореЗрдВрдЯ" рдпрд╛ "рдЕрдВрдбрд░-рдорд┐рдирд┐рдордо" рдХреЛ рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдЕрдзрд┐рдХрддрдо рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред


 int localCatchUp = min(catchUp, len); //            insertionSort(arr, 0, localCatchUp - 1); //     localCatchUp  if (len <= localCatchUp) //       n <= catchUp ,   return; //    (      ) 

рдирдореВрдирд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдВ


рдпрджрд┐ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдЦреЗрдВ


 int* selection = new int[len << 1]; //     new int[len * 2] int left = len - 1; //       int right = len; //       

рдЪрдпрди рд╕рд░рдгреА рдХреЗ рдкрд╣рд▓реЗ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рднрд░реЗрдВ


 selection[left--] = arr[0]; for (int i = 1; i < localCatchUp; ++i) { selection[right++] = arr[i]; } 

рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдирдП рд╕рд░рдгреА рдирдореВрдирд╛ рд╕рд░рдгреА рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдирдИ рдКрдВрдЪреЗ рджрд╛рдИрдВ рдУрд░ рдЬрд╛рддреЗ рд╣реИрдВ


рдЕрдЪрдпрдирд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдПрдБ


 int restLen = len >> 1; //     len / 2 int* restFirst = new int[restLen]; int* restSecond = new int[restLen]; int restFirstLen = 0; int restSecondLen = 0; 

рдЕрдм, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╕реНрд░реЛрдд рд╕рд░рдгреА рд╕реЗ рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рд╣реА рдЪрдпрди рд╣реИ


рдЪрдХреНрд░ рд▓реЛрдХрд▓рдЪреЗрдХрдЕрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рддрддреНрд╡ рдкрд╣рд▓реЗ рд╣реА рд╣рдорд╛рд░реЗ рдирдореВрдиреЗ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд╕реЗ рд╣рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ)ред рдФрд░ рдпрд╣ рдЕрдВрдд рддрдХ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдВрдд рдореЗрдВ, рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдпрд╛ рддреЛ рдЪрдпрди рд╕рд░рдгреА рдореЗрдВ рдпрд╛ рдЕрдВрдбрд░-рдЪрдпрди рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рдЪрдпрди рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдмрд╕ рдпрд╣ рдЬрд╛рдБрдЪреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рддрддреНрд╡ (рдпрд╛ рдмрд░рд╛рдмрд░) рддрддреНрд╡ рдХреЗ 8 рдкрджреЛрдВ рдкрд░ рдмрд╛рдИрдВ (рджрд╛рдИрдВ рдУрд░ - рд▓реЛрдХрд▓рдЪреИрдк) рд╣реИред рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдЗрди рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкрд╛рд╕ рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдпрд╣ рджрд╛рдИрдВ рдУрд░ рдХреЗ рд▓рд┐рдП рдерд╛, рдпрд╛рдиреА рдЕрдзрд┐рдХрддрдо рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдПред рдЙрд╕реА рддрд░рд╣, рд╣рдо рдХрдо рд╕реЗ рдХрдо рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рд╡рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЪрдпрди рдХреЗ рджреЛрдиреЛрдВ рдУрд░ рд╕рдореНрдорд┐рд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╢реЗрд╖ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред


рд▓реВрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


 for (int i = localCatchUp; i < len; ++i) { if (selection[right - localCatchUp] <= arr[i]) { selection[right] = arr[i]; for (int j = right; selection[j - 1] > selection[j]; --j) swap(selection[j - 1], selection[j]); ++right; continue; } if (selection[left + localCatchUp] >= arr[i]) { selection[left] = arr[i]; for (int j = left; selection[j] > selection[j + 1]; ++j) swap(selection[j], selection[j + 1]); --left; continue; } if (i & 1) { // i -  restFirst[restFirstLen++] = arr[i]; } else { restSecond[restSecondLen++] = arr[i]; } } 

рдлрд┐рд░, рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдкрд╣рд▓реЗ рд╣рдо рддрддреНрд╡ рдХреЛ рдКрдБрдЪрд╛рдЗрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдЕрдЧрд░ рд╣реЛ рд╕рдХреЗ рддреЛ рдЙрд╕реЗ рдЪрдврд╝рд╛рд╡ рдореЗрдВ рдлреЗрдВрдХ рджреЗрдВред рдЕрдЧрд░ рдпрд╣ рднреА рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ - рдЗрд╕реЗ рд░реЗрд╕реНрдЯрдлрд░реНрд╕реНрдЯ рдпрд╛ рд░реЗрд╕реНрдЯреЗрдХреЙрдиреНрдб рдореЗрдВ рдбрд╛рд▓реЗрдВред


рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрдм, рд▓реВрдк рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЪрдпрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд░рдгреА рд╣реИ (рддрддреНрд╡ рдЗрдВрдбреЗрдХреНрд╕ рдкрд░ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ [рдмрд╛рдПрдВ + 1] рдФрд░ рдЕрдВрдд рдореЗрдВ [рджрд╛рдИрдВ рдУрд░ - 1] ), рд╕рд╛рде рд╣реА рд░реЗрд╕реНрдЯрдлрд░реНрд╕реНрдЯ рдФрд░ рд░реЗрд╕реНрдЯрд╕реЗрдХрдВрдб рдПрд░реЗ рдХреА рд▓рдВрдмрд╛рдИ рд░реЗрд╕реНрдЯрдлрд░реНрд╕реНрдЯрд▓реЗрди рдФрд░ рд░реЗрд╕реНрдЯрд╕реЗрдХреЙрдиреНрдбрд▓реАрди, рдХреНрд░рдорд╢рдГред


рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдореЗрдореЛрд░реА рдХреЛ рдореБрдЦреНрдп рд╕рд░рдгреА рд╕реЗ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ (рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕рд╣реЗрдЬ рд▓рд┐рдпрд╛ рд╣реИ)


 delete[] arr; 

рд╣рдорд╛рд░реЗ рдЪрдпрди рд╕рд░рдгреА рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рдореЗрдореЛрд░реА рдХреЗ рдХрдИ рд╕реЗрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрдореГрддрд┐ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдВ


 int selectionLen = right - left - 1; //     int* copy = glue(selection + left + 1, selectionLen, nullptr, 0); //        delete[] selection; //    2 * len   selection = copy; //      ,   

рдЕрдм рд░рд┐рд╕реНрдЯреЛрд░рд╕реНрдЯ рдФрд░ рд░реЗрд╕реНрдЯрд╕реЗрдХрдВрдб рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдПрдБ


рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдХреЛ рдЕрдВрдд рддрдХ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗ рдмрд╛рдж, рд░реЗрд╕реНрдЯ рдлрд╝рд░реНрд╕реНрдЯ рдФрд░ рд░реЗрд╕реНрдЯрд╕реЗрдХрдВрдб рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 newGenerationSort(restFirst, restFirstLen); newGenerationSort(restSecond, restSecondLen); 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рдПрдХ рдореЗрдВ 3 рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдФрд░ рдкреЙрдЗрдВрдЯрд░ рдЕрд░реЗрд╕реНрдЯ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЖрдк рдкрд╣рд▓реЗ restFirst + restSecond рдХреЛ рдХреБрдЫ restFull рд╕рд░рдгреА рдореЗрдВ рдорд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЪрдпрди + restFull рдХреЛ рдорд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рд▓реЗрдХрд┐рди рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдПрдХ рдРрд╕реА рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЪрдпрди рд╕рд░рдгреА рдореЗрдВ рдмрд╛рдХреА рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рддрддреНрд╡ рд╣реЛрдВрдЧреЗред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЪрдпрди рдореЗрдВ 100 рддрддреНрд╡ рд╣реИрдВ, restFirst рдореЗрдВ 990 рд╣реИрдВ, рдФрд░ restSecond рдореЗрдВ 1010 рд╢рд╛рдорд┐рд▓ рд╣реИрдВ ред рдлрд┐рд░, рдПрдХ RestFull рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ 990 + 1010 = 2000 рдХреЙрдкреА рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ рдЪрдпрди рдХреЗ рд╕рд╛рде рд╡рд┐рд▓рдп рдХреЗ рд▓рд┐рдП - рдПрдХ рдФрд░ 2000 + 100 рдкреНрд░рддрд┐рдпрд╛рдВред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдХреБрд▓ рдкреНрд░рддрд┐ 2000 + 2100 = 4100 рд╣реЛрдЧреАред

рдЪрд▓реЛ рдпрд╣рд╛рдБ рдЕрдиреБрдХреВрд▓рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдЪрдпрди рдХреЛ рдорд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рдЪрдпрди рд╕рд░рдгреА рдореЗрдВ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ред рдХреЙрдкреА рдСрдкрд░реЗрд╢рдиреНрд╕: 100 + 990 = 1090ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЪрдпрди рдФрд░ рд░реЗрд╕реНрдЯреЗрдХрдВрдб рдРрд░реЗ рдХреЛ рдорд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдФрд░ 1090 + 1010 = 2100 рдкреНрд░рддрд┐рдпрд╛рдВ рдЦрд░реНрдЪ рдХрд░реЗрдВред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, 2100 + 1090 = 3190 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдкрд┐рдЫрд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рд▓рдЧрднрдЧ рдПрдХ рдЪреМрдерд╛рдИ рдХрдо рд╣реИред


рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЕрдВрддрд┐рдо рд╡рд┐рд▓рдп


 int* part2; int part2Len; if (selectionLen < restFirstLen) { glueDelete(selection, restFirst, restFirstLen, selection, selectionLen); // selection += restFirst selectionLen += restFirstLen; part2 = restSecond; part2Len = restSecondLen; } else { glueDelete(part2, restFirst, restFirstLen, restSecond, restSecondLen); // part2 = restFirst + restSecond part2Len = restFirstLen + restSecondLen; } glueDelete(arr, selection, selectionLen, part2, part2Len); 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░реЗрд╕реНрдЯрдлрд░реНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЪрдпрди рдХреЛ рдорд░реНрдЬ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд▓рд╛рднрджрд╛рдпрдХ рд╣реИ, рддреЛ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рд╣рдо "restFull" рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░ рджреЗрддреЗ рд╣реИрдВ


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЕрдВрддрд┐рдо рдХреЛрдб:
 /// works only if arr is pointer assigned by new keyword void newGenerationSort(int*& arr, int len) { int localCatchUp = min(catchUp, len); //            insertionSort(arr, 0, localCatchUp - 1); //     localCatchUp  if (len <= localCatchUp) //       n <= catchUp  return; //      int* selection = new int[len << 1]; //     new int[len * 2] int left = len - 1; //       int right = len; //       selection[left--] = arr[0]; for (int i = 1; i < localCatchUp; ++i) { selection[right++] = arr[i]; } int restLen = len >> 1; int* restFirst = new int[restLen]; int* restSecond = new int[restLen]; int restFirstLen = 0; int restSecondLen = 0; for (int i = localCatchUp; i < len; ++i) { if (selection[right - localCatchUp] <= arr[i]) { selection[right] = arr[i]; for (int j = right; selection[j - 1] > selection[j]; --j) swap(selection[j - 1], selection[j]); ++right; continue; } if (selection[left + localCatchUp] >= arr[i]) { selection[left] = arr[i]; for (int j = left; selection[j] >= selection[j + 1]; ++j) swap(selection[j], selection[j + 1]); --left; continue; } if (i & 1) { // i -  restFirst[restFirstLen++] = arr[i]; } else { restSecond[restSecondLen++] = arr[i]; } } delete[] arr; int selectionLen = right - left - 1; //     int* copy = glue(selection + left + 1, selectionLen, nullptr, 0); //        delete[] selection; //    2 * len   selection = copy; //      ,   newGenerationSort(restFirst, restFirstLen); newGenerationSort(restSecond, restSecondLen); int* part2; int part2Len; if (selectionLen < restFirstLen) { glueDelete(selection, restFirst, restFirstLen, selection, selectionLen); // selection += restFirst selectionLen += restFirstLen; part2 = restSecond; part2Len = restSecondLen; } else { glueDelete(part2, restFirst, restFirstLen, restSecond, restSecondLen); // part2 = restFirst + restSecond part2Len = restFirstLen + restSecondLen; } glueDelete(arr, selection, selectionLen, part2, part2Len); } 


рдЕрдм рд╕рдордп рдкрд░реАрдХреНрд╖рдг


Source.cpp рдореЗрдВ рдореБрдЦреНрдп рдХреЛрдб:
 #include <iostream> #include <ctime> #include <vector> #include <algorithm> #include "time_utilities.h" #include "sort_utilities.h" using namespace std; using namespace rela589n; void printArr(int* arr, int len) { for (int i = 0; i < len; ++i) { cout << arr[i] << " "; } cout << endl; } bool arraysEqual(int* arr1, int* arr2, int len) { for (int i = 0; i < len; ++i) { if (arr1[i] != arr2[i]) { return false; } } return true; } int* createArray(int length) { int* a1 = new int[length]; for (int i = 0; i < length; i++) { a1[i] = rand(); //a1[i] = (i + 1) % (length / 4); } return a1; } int* array_copy(int* arr, int length) { int* a2 = new int[length]; for (int i = 0; i < length; i++) { a2[i] = arr[i]; } return a2; } void tester(int tests, int length) { double t1, t2; int** arrays1 = new int* [tests]; int** arrays2 = new int* [tests]; for (int t = 0; t < tests; ++t) { //    int* arr1 = createArray(length); arrays1[t] = arr1; arrays2[t] = array_copy(arr1, length); } t1 = getCPUTime(); for (int t = 0; t < tests; ++t) { quickSort(arrays1[t], 0, length - 1); } t2 = getCPUTime(); cout << "Avg Qsort time for " << length << " elements: " << (t2 - t1) * 1000 / tests << endl; int portion = catchUp = 8; t1 = getCPUTime(); for (int t = 0; t < tests; ++t) { newGenerationSort(arrays2[t], length); } t2 = getCPUTime(); cout << "Avg newGenSort time for " << length << " elements: " << (t2 - t1) * 1000 / tests //<< " Catch up coef: "<< portion << endl; bool confirmed = true; //     for (int t = 0; t < tests; ++t) { if (!arraysEqual(arrays1[t], arrays2[t], length)) { confirmed = false; break; } } if (confirmed) { cout << "Confirmed" << endl; } else { cout << "Review your code! Something wrong..." << endl; } } int main() { srand(time(NULL)); int length; double t1, t2; cout << "size: "; cin >> length; int t; cout << "tests: "; cin >> t; tester(t, length); system("pause"); return 0; } 


рддреНрд╡рд░рд┐рдд рд╕реЙрд░реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

рдПрдХ рдЫреЛрдЯреА рдЯрд┐рдкреНрдкрдгреА: рдореИрдВрдиреЗ рдХреНрд╡рд┐рдХреЙрд░реНрдЯ рдХреЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рдИрдорд╛рдирджрд╛рд░ рд╣реЛред рдпрджреНрдпрдкрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, рдпрд╣ рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 2 рдЧреБрдирд╛ рдзреАрдорд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


 // [min, max] int random(int min, int max) { return min + rand() % ((max + 1) - min); } void quickSort(int * arr, int b, int e) { int l = b, r = e; int piv = arr[random(l, r)]; while (l <= r) { for (; arr[l] < piv; ++l); for (; arr[r] > piv; --r); if (l <= r) swap(arr[l++], arr[r--]); } if (b < r) quickSort(arr, b, r); if (e > l) quickSort(arr, l, e); } 


getCPUTime - рд╕реАрдкреАрдпреВ рд╕рдордп рдорд╛рдк:
 #pragma once #if defined(_WIN32) #include <Windows.h> #elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__)) #include <unistd.h> #include <sys/resource.h> #include <sys/times.h> #include <time.h> #else #error "Unable to define getCPUTime( ) for an unknown OS." #endif /** * Returns the amount of CPU time used by the current process, * in seconds, or -1.0 if an error occurred. */ double getCPUTime() { #if defined(_WIN32) /* Windows -------------------------------------------------- */ FILETIME createTime; FILETIME exitTime; FILETIME kernelTime; FILETIME userTime; if (GetProcessTimes(GetCurrentProcess(), &create;Time, &exit;Time, &kernel;Time, &user;Time) != -1) { SYSTEMTIME userSystemTime; if (FileTimeToSystemTime(&user;Time, &user;SystemTime) != -1) return (double)userSystemTime.wHour * 3600.0 + (double)userSystemTime.wMinute * 60.0 + (double)userSystemTime.wSecond + (double)userSystemTime.wMilliseconds / 1000.0; } #elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__)) /* AIX, BSD, Cygwin, HP-UX, Linux, OSX, and Solaris --------- */ #if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) /* Prefer high-res POSIX timers, when available. */ { clockid_t id; struct timespec ts; #if _POSIX_CPUTIME > 0 /* Clock ids vary by OS. Query the id, if possible. */ if (clock_getcpuclockid(0, &id;) == -1) #endif #if defined(CLOCK_PROCESS_CPUTIME_ID) /* Use known clock id for AIX, Linux, or Solaris. */ id = CLOCK_PROCESS_CPUTIME_ID; #elif defined(CLOCK_VIRTUAL) /* Use known clock id for BSD or HP-UX. */ id = CLOCK_VIRTUAL; #else id = (clockid_t)-1; #endif if (id != (clockid_t)-1 && clock_gettime(id, &ts;) != -1) return (double)ts.tv_sec + (double)ts.tv_nsec / 1000000000.0; } #endif #if defined(RUSAGE_SELF) { struct rusage rusage; if (getrusage(RUSAGE_SELF, &rusage;) != -1) return (double)rusage.ru_utime.tv_sec + (double)rusage.ru_utime.tv_usec / 1000000.0; } #endif #if defined(_SC_CLK_TCK) { const double ticks = (double)sysconf(_SC_CLK_TCK); struct tms tms; if (times(&tms;) != (clock_t)-1) return (double)tms.tms_utime / ticks; } #endif #if defined(CLOCKS_PER_SEC) { clock_t cl = clock(); if (cl != (clock_t)-1) return (double)cl / (double)CLOCKS_PER_SEC; } #endif #endif return -1; /* Failed. */ } 


рдорд╢реАрди рдкрд░ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдПрдХ рдкреНрд░рддрд┐рд╢рдд рдкрд░ рдХрд┐рдП рдЧрдП рдереЗред рдЗрдВрдЯреЗрд▓ рдХреЛрд░ i3 7100u рдФрд░ 8GB рд░реИрдо


рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рд░рдгреА
 a1[i] = rand(); 


рдЫрд╡рд┐
рдЫрд╡рд┐
рдЫрд╡рд┐
рдЫрд╡рд┐
рдЫрд╡рд┐

рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЖрджреЗрд╢рд┐рдд рдРрд░реЗ
 a1[i] = (i + 1) % (length / 4); 

рдЫрд╡рд┐
рдЫрд╡рд┐
рдЫрд╡рд┐
рдЫрд╡рд┐
рдЫрд╡рд┐

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдРрд░реЗ
 a1[i] = (i + 1); 

рдЫрд╡рд┐
рдЫрд╡рд┐
рдЫрд╡рд┐
рдЫрд╡рд┐
рдЫрд╡рд┐

рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рд╣рдо рдЬреЛ рдЪрд╛рд╣рддреЗ рдереЗ рд╡рд╣ рд╕рдм рд╣рд╛рд╕рд┐рд▓ рд╣реЛ рдЧрдпрд╛ред рд╕реНрдерд┐рд░рддрд╛ рдХреА рдХреАрдордд рдкрд░, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА рд╣реИред рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╕ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ,> рд╕рд╛рдЗрди рдХреЗ рдмрдЬрд╛рдп, something рдпрд╛ рдХреБрдЫ рдФрд░ рдбрд╛рд▓реЗрдВред

Source: https://habr.com/ru/post/hi484798/


All Articles