рд╣реИрд╢ рдЯреЗрдмрд▓ рд╕рдореНрдорд┐рд▓рди рдкреНрд░рдХрд╛рд░

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

рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ - рдореИрдВ рдПрдХ рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реВрдВред


рдЗрд╕рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
  1. рдкрд╣рд▓реА рдкрд╛рд╕ рдкрд░, рд╣рдо рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ (рдП рдорд┐рди , рдП рдореИрдХреНрд╕ ) рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЗ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдорд╛рди рдкрд╛рддреЗ рд╣реИрдВред
  2. рджреВрд╕рд░реЗ рдкрд╛рд╕ рдореЗрдВ, рд╣рдо рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдбреЗрдХреНрд╕ = ( int ) (k * (A i -A min ) * TMPLEN / (рдПрдХ рдЕрдзрд┐рдХрддрдо - рдиреНрдпреВрдирддрдо ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реБрдП рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  3. рддреАрд╕рд░реЗ рдкрд╛рд╕ рдкрд░, рд╣рдо рд╣реИрд╢ рдЯреЗрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдореВрд▓ рд╕рд░рдгреА рдореЗрдВ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВред

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

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

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддреБрд▓рдирд╛ рдФрд░ рдЧрдгрдирд╛ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИред

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

рдПрдХ рд╕рдорд╛рди рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддреНрд╡рд░рд┐рдд рдЫрдВрдЯрд╛рдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 20-25% рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдореЗрдореЛрд░реА рдУрд╡рд░рд╣реЗрдб O (n) рд╣реИ ред

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

рдлрд╛рдпрджреЗ:

рдиреБрдХрд╕рд╛рди:

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдХрд╛рджрдорд┐рдХ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рджреБрдЦ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЬрд╛рд╡рд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╕реНрд░реЛрдд рдХреЛрдбред

рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдореЛрдб рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк SORTBLOCK = SOURCELEN рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢реБрджреНрдз рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред MIN_VAL рдФрд░ MAX_VAL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЬрдм SOURCELEN <300, рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдХрдВрд╕реЛрд▓ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддрд╛ рд╣реИред рд╕рд░рдгреА рдореЗрдВ рд░рд┐рдХреНрдд рдорд╛рди рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╢реВрдиреНрдп рдХреЛ рдЪреБрдирд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реАрдорд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдФрд░ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкрдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд░реЗрдЧрд╛ред рдЬрдм рд╕рдордп рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдврд╛рдВрдЪреЗ рдкрд░ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рд╣рдХрд░реНрдореА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред

import java.util.Arrays; import java.util.Date; import java.util.Random; public class HashSort { //     static int SOURCELEN = 1000000; int source[] = new int[SOURCELEN]; //         int quick[] = new int[SOURCELEN]; //      static int SORTBLOCK = 500; static int k = 3; //   static int TMPLEN = (SOURCELEN < SORTBLOCK * k) ? SORTBLOCK * k : SOURCELEN; int tmp[] = new int[TMPLEN]; //     static int MIN_VAL = 10; static int MAX_VAL = 1000000; int minValue = 0; int maxValue = 0; double hashKoef = 0; long finishTime = 0; long startTime = 0; long finishTimeQuick = 0; long startTimeQuick = 0; //       public void randomize() { int i; Random rnd = new Random(); for(i=0; i<SOURCELEN; i++) { int rndValue = MIN_VAL + ((int)(rnd.nextDouble()*((double)MAX_VAL-MIN_VAL))); source[i] = rndValue; } } //          - public void findMinMax(int startIndex, int endIndex) { int i; minValue = source[startIndex]; maxValue = source[startIndex]; for(i=startIndex+1; i<=endIndex; i++) { if( source[i] > maxValue) { maxValue = source[i]; } if( source[i] < minValue) { minValue = source[i]; } } hashKoef = ((double)(k-1)*0.9)*((double)(endIndex-startIndex)/((double)maxValue-(double)minValue)); } //       public void stickParts(int startIndex, int mediana, int endIndex) { int i=startIndex; int j=mediana+1; int k=0; while(i<=mediana && j<=endIndex) { if(source[i]<source[j]) { tmp[k] = source[i]; i++; } else { tmp[k] = source[j]; j++; } k++; } if( i>mediana ) { while(j<=endIndex) { tmp[k] = source[j]; j++; k++; } } if(j>endIndex) { while(i<=mediana) { tmp[k] = source[i]; i++; k++; } } System.arraycopy(tmp, 0, source, startIndex, endIndex-startIndex+1); } //         boolean shiftRight(int index) { int endpos = index; while( tmp[endpos] != 0) { endpos++; if(endpos == TMPLEN) return false; } while(endpos != index ) { tmp[endpos] = tmp[endpos-1]; endpos--; } tmp[endpos] = 0; return true; } // -    public int hash(int value) { return (int)(((double)value - (double)minValue)*hashKoef); } //         public void insertValue(int index, int value) { int _index = index; while(tmp[_index] != 0 && tmp[_index] <= value) { _index++; } if( tmp[_index] != 0) { shiftRight(_index); } tmp[_index] = value; } //         public void extract(int startIndex, int endIndex) { int j=startIndex; for(int i=0; i<(SORTBLOCK*k); i++) { if(tmp[i] != 0) { source[j] = tmp[i]; j++; } } } public void clearTMP() { if( tmp.length < SORTBLOCK*k) { Arrays.fill(tmp, 0); } else { Arrays.fill(tmp, 0, SORTBLOCK*k, 0); } } //   public void hashingSort(int startIndex, int endIndex) { // 1.          findMinMax(startIndex, endIndex); // 2.    clearTMP(); // 3.       - for(int i=startIndex; i<=endIndex; i++) { insertValue(hash(source[i]), source[i]); } // 4.         extract(startIndex, endIndex); } //          public void sortPart(int startIndex, int endIndex) { if( (endIndex - startIndex) <= SORTBLOCK ) { hashingSort(startIndex, endIndex); return; } int mediana = startIndex + (endIndex - startIndex) / 2; sortPart(startIndex, mediana); sortPart(mediana+1, endIndex); stickParts(startIndex, mediana, endIndex); } public void sort() { sortPart(0, SOURCELEN-1); } //   public String toString() { int i; String res = ""; res += "Source:"; if( SOURCELEN < 300) { for(i=0; i<SOURCELEN; i++) { res += " " + source[i]; } } res += "\n"; res += "Quick: "; if( SOURCELEN < 300) { for(i=0; i<SOURCELEN; i++) { res += " " + quick[i]; } } res += "\n"; res += "len: " + SOURCELEN + "\n"; res += "hashing&merge sort time: " + (finishTime - startTime) + "\n"; res += "quick sort time: " + (finishTimeQuick - startTimeQuick) + "\n"; return res; } //         public void copyToQuick() { System.arraycopy(source, 0, quick, 0, source.length); } public static void main(String[] args) { HashSort hs = new HashSort(); hs.randomize(); hs.copyToQuick(); hs.startTime = (new Date()).getTime(); hs.sort(); hs.finishTime = (new Date()).getTime(); hs.startTimeQuick = (new Date()).getTime(); Arrays.sort(hs.quick); hs.finishTimeQuick = (new Date()).getTime(); System.out.println(hs.toString()); } } 

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


All Articles