рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд╡рд┐рдХ рд╕реЙрд░реНрдЯ рд╕рднреА рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╣реИред рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╕рдорд░реНрдерди рддрддреНрд╡ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ ( рдлрд┐рд░ рдЬрдЯрд┐рд▓рддрд╛ рдУ рд╣реИ (рдПрди рд▓реЙрдЧ рдПрди) )ред рдЕрдиреНрдпрдерд╛, рд╕реНрдкрд░реНрд╢реЛрдиреНрдореБрдЦ рд╡реНрдпрд╡рд╣рд╛рд░ рд▓рдЧрднрдЧ рдмреБрд▓рдмреБрд▓реЗ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛ ( рдпрд╛рдиреА, рдУ (рдПрди 2 ) )ред
рдЙрд╕реА рд╕рдордп, рдпрджрд┐ рд╕рд░рдгреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрд░рдордмрджреНрдз рд╣реИ, рддреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрднреА рднреА рдУ (рдПрди рд▓реЙрдЧ рдПрди) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ quick_sort рд╕реЗ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рд╕рд░рдгреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЙрд░реНрдЯ рдХреА рдЧрдИ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрд╛рд░ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рди рдЪрд▓рд╛рдПрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдХрдИ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИред
"рдпрд╣ рд╢рд╛рдо рдереА, рд╡рд╣рд╛рдБ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдирд╛ рдерд╛," рд╕рд░реНрдЧреЗрдИ рдорд┐рдЦрд╛рд▓рдХреЛрд╡ред
рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ:
- рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рдорд▓рд╛ рд╣реЗ (рдПрди)
- рдУ рдХрд╛ рдФрд╕рдд рдорд╛рдорд▓рд╛ (рдПрди рд▓реЙрдЧ рдПрди)
- рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рд╣реЗ (рдПрди рд▓реЙрдЧ рдПрди)
- рддреНрд╡рд░рд┐рдд рдЫрдБрдЯрд╛рдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдФрд╕рдд рдкрд░
рд╡рд┐рд╖рдп рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛: рдЕрдм рдЪрд▓реЛ рдпрд╣ рд╕рдм рдХреНрд░рдо рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ
рд╣рдорд╛рд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдФрд╕рдд рдорд╛рдорд▓реЗ рдореЗрдВ рдПрд╕рд┐рдореНрдкреНрдЯреЛрдЯрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрдо рд╕реЗ рдХрдо рдУ (рдПрди рд▓реЙрдЧ рдПрди), рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛, рдУ (рдПрди) рдкрд░ рд╣реЛред рд╣рдо рд╕рднреА рдЗрд╕ рдмрд╛рдд рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐, рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ, рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд░реВрдк рд╕реЗ, рдЙрд╕реЗ рдХрдИ рдмрд╛рд░ рд╕рд░рдгреА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдбреНрд░рд╛рдЗрд╡ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рддрддреНрд╡ рд╣реИрдВред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд▓рдп рдХрд╛ рдХрд╛рд░реНрдпint* glue(int* a, int lenA, int* b, int lenB) { int lenC = lenA + lenB; int* c = new int[lenC];
рджреЛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд▓рдп рдХрд╛ рдХрд╛рд░реНрдп, рдкрд░рд┐рдгрд╛рдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдХ рдкрд░ рдмрдЪрд╛рддрд╛ рд╣реИред void glueDelete(int*& arr, int*& a, int lenA, int*& b, int lenB) { if (lenA == 0) {
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд▓реЛ рдФрд░ рд╣рд╛рдп рдХреЗ рдмреАрдЪ рдЖрд╡реЗрд╖рдг рджреНрд╡рд╛рд░рд╛ рдЫрдБрдЯрд╛рдИ рдХрд░рддрд╛ рд╣реИ 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];
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдЕрдкрдиреЗ рдореВрд▓ рд╕рд░рдгреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирдореВрдиреЗ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 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])
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рд╕реЙрд░реНрдЯ рд╕реЗрдЯ рд╣реИ, рдФрд░ "рд╢реЗрд╖" рддрддреНрд╡ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдЕрднреА рднреА рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдХреБрдЫ рдореЗрдореЛрд░реА рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрдореГрддрд┐ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдВ
int selectionLen = right - left - 1;
рд╢реЗрд╖ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕реЙрд░реНрдЯ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЪрдпрди рдХреЗ рд╕рд╛рде рдорд░реНрдЬ рдХрд░реЗрдВ
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])
рдЖрдЗрдП рдХреНрд╡рд┐рдХ рд╕реЙрд░реНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЧрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗред 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) {
рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
void newMergeSort(int *arr, int length) { int portion = log2(length);
рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо:

рд╣рд╛рдВ, рдЧрддрд┐ рдореЗрдВ рд╡реГрджреНрдзрд┐ рджреЗрдЦреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреНрд╡рд┐рдХ рд╕реЙрд░реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рд░рдгрд┐рдпреЛрдВ рдкрд░ O (n) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рднреА рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдХрд▓реНрдк
рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдУ (рдПрди 2 ) рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ 1 рд╕рд░рдгреА рдореЗрдВ рдирд╣реАрдВ рдереЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ 2 рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣ рдХреЗрд╡рд▓ рдЗрди рджреЛ рднрд╛рдЧреЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рдорд░реНрдЬ рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ O рдХреЗ рдмрд░рд╛рдмрд░ рдЬрдЯрд┐рд▓рддрд╛ рдорд┐рд▓рддреА рд╣реИ (n log n)
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ, рдХреНрд░рдордмрджреНрдз рд╕рд░рдгреА рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдзрд┐рдХрддрдо (рдиреНрдпреВрдирддрдо) рддрддреНрд╡ рдХрд╛рдлреА рдЬрд▓реНрджреА рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд╣рдорд╛рд░реА рдорджрдж рдХреЗ рд▓рд┐рдП рдЖрддреА рд╣реИред рдЪрдпрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рд╣рдо рдЬрд╛рдБрдЪреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдкреНрд░рд╡рд╛рд╣ рддрддреНрд╡ рдХреЛ рдЕрдВрддрд┐рдо рдХреЗ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрда рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реИрдВред
рдпрджрд┐ рдпрд╣ рдЕрднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд░реЗрд╢рд╛рди рди рд╣реЛрдВред рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдм рдХреЛрдб рдкрд░ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреНрд░рд╢реНрди рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддрд░рд╣ рд╣реА рд╣реИ
void newGenerationSort(int*& arr, int len)
рд▓реЗрдХрд┐рди рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЛ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░ рдорд╛рдирддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдбрд┐рд▓реАрдЯ [] рдСрдкрд░реЗрд╢рди рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВ - рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ)ред рдпрд╣реА рд╣реИ, рдЬрдм рд╣рдордиреЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА, рддреЛ рд╣рдордиреЗ рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдкрддрд╛ рд╕реМрдВрдкрд╛ред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддреИрдпрд╛рд░реА
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рддрдерд╛рдХрдерд┐рдд "рдХреИрдЪ рдЕрдк рдЧреБрдгрд╛рдВрдХ" рдХреЗрд╡рд▓ 8 рдХреЗ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд┐рд░ рд╣реИред рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рддрдиреЗ рдирдП "рдЕрдВрдбрд░-рдореИрдХреНрд╕рд┐рдореЗрдВрдЯ" рдпрд╛ "рдЕрдВрдбрд░-рдорд┐рдирд┐рдордо" рдХреЛ рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдЕрдзрд┐рдХрддрдо рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
int localCatchUp = min(catchUp, len);
рдирдореВрдирд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдВ
рдпрджрд┐ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдЦреЗрдВ
int* selection = new int[len << 1];
рдЪрдпрди рд╕рд░рдгреА рдХреЗ рдкрд╣рд▓реЗ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЛ рднрд░реЗрдВ
selection[left--] = arr[0]; for (int i = 1; i < localCatchUp; ++i) { selection[right++] = arr[i]; }
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдирдП рд╕рд░рдгреА рдирдореВрдирд╛ рд╕рд░рдгреА рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдирдИ рдКрдВрдЪреЗ рджрд╛рдИрдВ рдУрд░ рдЬрд╛рддреЗ рд╣реИрдВ
рдЕрдЪрдпрдирд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдгрд┐рдпрд╛рдБ рдмрдирд╛рдПрдБ
int restLen = len >> 1;
рдЕрдм, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╕реНрд░реЛрдд рд╕рд░рдгреА рд╕реЗ рддрддреНрд╡реЛрдВ рдХрд╛ рд╕рд╣реА рдЪрдпрди рд╣реИ
рдЪрдХреНрд░ рд▓реЛрдХрд▓рдЪреЗрдХрдЕрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рддрддреНрд╡ рдкрд╣рд▓реЗ рд╣реА рд╣рдорд╛рд░реЗ рдирдореВрдиреЗ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд╕реЗ рд╣рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ)ред рдФрд░ рдпрд╣ рдЕрдВрдд рддрдХ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдВрдд рдореЗрдВ, рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдпрд╛ рддреЛ рдЪрдпрди рд╕рд░рдгреА рдореЗрдВ рдпрд╛ рдЕрдВрдбрд░-рдЪрдпрди рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рдЪрдпрди рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдмрд╕ рдпрд╣ рдЬрд╛рдБрдЪреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рддрддреНрд╡ (рдпрд╛ рдмрд░рд╛рдмрд░) рддрддреНрд╡ рдХреЗ 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) {
рдлрд┐рд░, рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдкрд╣рд▓реЗ рд╣рдо рддрддреНрд╡ рдХреЛ рдКрдБрдЪрд╛рдЗрдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ - рдЕрдЧрд░ рд╣реЛ рд╕рдХреЗ рддреЛ рдЙрд╕реЗ рдЪрдврд╝рд╛рд╡ рдореЗрдВ рдлреЗрдВрдХ рджреЗрдВред рдЕрдЧрд░ рдпрд╣ рднреА рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ - рдЗрд╕реЗ рд░реЗрд╕реНрдЯрдлрд░реНрд╕реНрдЯ рдпрд╛ рд░реЗрд╕реНрдЯреЗрдХреЙрдиреНрдб рдореЗрдВ рдбрд╛рд▓реЗрдВред
рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрдм, рд▓реВрдк рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЪрдпрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд░рдгреА рд╣реИ (рддрддреНрд╡ рдЗрдВрдбреЗрдХреНрд╕ рдкрд░ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ [рдмрд╛рдПрдВ + 1] рдФрд░ рдЕрдВрдд рдореЗрдВ [рджрд╛рдИрдВ рдУрд░ - 1] ), рд╕рд╛рде рд╣реА рд░реЗрд╕реНрдЯрдлрд░реНрд╕реНрдЯ рдФрд░ рд░реЗрд╕реНрдЯрд╕реЗрдХрдВрдб рдПрд░реЗ рдХреА рд▓рдВрдмрд╛рдИ рд░реЗрд╕реНрдЯрдлрд░реНрд╕реНрдЯрд▓реЗрди рдФрд░ рд░реЗрд╕реНрдЯрд╕реЗрдХреЙрдиреНрдбрд▓реАрди, рдХреНрд░рдорд╢рдГред
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдореЗрдореЛрд░реА рдХреЛ рдореБрдЦреНрдп рд╕рд░рдгреА рд╕реЗ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ (рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕рд╣реЗрдЬ рд▓рд┐рдпрд╛ рд╣реИ)
delete[] arr;
рд╣рдорд╛рд░реЗ рдЪрдпрди рд╕рд░рдгреА рдореЗрдВ рдЕрдкреНрд░рдпреБрдХреНрдд рдореЗрдореЛрд░реА рдХреЗ рдХрдИ рд╕реЗрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрдкреНрд░рдпреБрдХреНрдд рд╕реНрдореГрддрд┐ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдВ
int selectionLen = right - left - 1;
рдЕрдм рд░рд┐рд╕реНрдЯреЛрд░рд╕реНрдЯ рдФрд░ рд░реЗрд╕реНрдЯрд╕реЗрдХрдВрдб рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рддрд░рд╣ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдПрдБ
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдХреЛ рдЕрдВрдд рддрдХ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗ рдмрд╛рдж, рд░реЗрд╕реНрдЯ рдлрд╝рд░реНрд╕реНрдЯ рдФрд░ рд░реЗрд╕реНрдЯрд╕реЗрдХрдВрдб рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
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);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд░реЗрд╕реНрдЯрдлрд░реНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЪрдпрди рдХреЛ рдорд░реНрдЬ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд▓рд╛рднрджрд╛рдпрдХ рд╣реИ, рддреЛ рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рд╣рдо "restFull" рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░ рджреЗрддреЗ рд╣реИрдВ
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЕрдВрддрд┐рдо рдХреЛрдб: рдЕрдм рд╕рдордп рдкрд░реАрдХреНрд╖рдг
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 рдЧреБрдирд╛ рдзреАрдорд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
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] = (i + 1) % (length / 4);





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