рдпрд╣ рдкреЛрд╕реНрдЯ рдПрдХреНрд╕рдХреЙрд░реНрд╕реНрдХреЛрд░ рд╕рд░реНрд╡рд┐рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдПрдЧрд╛ред рдЫрдБрдЯрд╛рдИ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:- рд╕рд░рдгреА рднрд╛рдЧреЛрдВ рдореЗрдВ рдЯреВрдЯ рдЧрдИ рд╣реИ
- рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рд╣рдо рдЖрджреЗрд╢рд┐рдд рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ
рдпрд╣рд╛рдВ рдорд░реНрдЬ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░рдгреА рдХреЛ рдХреЗрд╡рд▓ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)редрдорд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:public static String[] merge( String[] leftPart, String[] rightPart ) {
int cursorLeft = 0, cursorRight = 0, counter = 0;
String[] merged = new String[leftPart.length + rightPart.length];
while ( cursorLeft < leftPart.length && cursorRight < rightPart.length ) {
if (leftPart[cursorLeft].compareTo(rightPart[cursorRight] ) < 0 ) {
merged[counter] = leftPart[cursorLeft];
cursorLeft+=1;
} else {
merged[counter] = rightPart[cursorRight];
cursorRight+=1;
}
counter++;
}
if ( cursorLeft < leftPart.length ) {
System.arraycopy( leftPart, cursorLeft, merged, counter, merged.length - counter );
}
if ( cursorRight < rightPart.length ) {
System.arraycopy( rightPart, cursorRight, merged, counter, merged.length - counter );
}
return merged;
}
рд╕рдорд╛рд░реЛрд╣ рд╕рдорд╛рд░реЛрд╣ рдХреЛрдб рдпрд╣рд╛рдБ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ редрдорд░реНрдЬ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ: рд╢реБрд░реБрдЖрдд рдореЗрдВ, рджреЛрдиреЛрдВ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкрд╣рд▓реЗ рддрддреНрд╡ рдкрд░ рд╣реИрдВред рдЕрдЧрд▓рд╛, рдкреЙрдЗрдВрдЯрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрдиреБрд░реВрдк рддрддреНрд╡реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЫреЛрдЯреЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрддреНрд╡ рдХреЛ рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪрдХреНрд░ рддрдм рддрдХ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рдПрдХ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдЕрдВрдд рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдмрд╛рдХреА рджреВрд╕рд░реЗ рд╕рд░рдгреА рдХреЛ рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдХреНрд░рдордмрджреНрдз рд╕рд░рдгреА рд╣реИредрдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рднреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛; рдЗрд╕рдореЗрдВ рдПрдХ рд░рди рд╡рд┐рдзрд┐ рдмрдирд╛рдИ рдЧрдИ рдереА, рдЬрд┐рд╕реЗ рдкреНрд░рд╛рд░рдВрдн () рд╡рд┐рдзрд┐ рдкреНрд░рдХрд╛рд░ рдереНрд░реЗрдб рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд╖реНрдкрд╛рджрдХ рд╕реЗрд╡рд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧреАред рдпрд╣рд╛рдБ рдорд░реНрдЬ рдХреНрд▓рд╛рд╕ рдХрд╛ рдХреЛрдб рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:
public class Merger implements Runnable{
private String[] unsorted, sorted;
public Merger(String[] unsorted) {
this.unsorted = unsorted;
}
public void run() {
int middle;
String[] left, right;
if ( unsorted.length <= 1 ) {
sorted = unsorted;
} else {
middle = unsorted.length / 2;
left = new String[middle];
right = new String[unsorted.length - middle];
System.arraycopy(unsorted, 0, left, 0, middle);
System.arraycopy(unsorted, middle, right, 0, unsorted.length - middle);
SimpleMerger leftSort = new SimpleMerger(left);
SimpleMerger rightSort = new SimpleMerger(right);
leftSort.sort();
rightSort.sort();
sorted = SimpleMerger.merge(leftSort.getSorted(), rightSort.getSorted());
}
}
public String[] getSorted() {
return sorted;
}
}
рд╕рд░рдгреА рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдЫрд╛рдБрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЬрд╛рд╡рд╛ рдЫрдБрдЯрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдереНрд░реЗрдб рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд┐рдореНрди рд╣реИред рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдФрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордп рдорд╛рдкрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕реНрдкреЙрдЗрд▓рд░: рдмрд╣реБ-рдереНрд░реЗрдб рдбреЗрдЯрд╛ рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдкрд░ рддреНрд╡рд░рдг рджреЗрддрд╛ рд╣реИ:
public static void main(String[] args) throws Exception {
int arrSize = 1_000_000_0;
String[] unsorted = new String[arrSize];
Random randomizer = new Random();
for ( int i = 0; i < arrSize; i++ ) {
unsorted[i] = Integer.toString(randomizer.nextInt( 100_000_0 ));
}
List<Future> futures = new ArrayList<>();
int processorCount = Runtime.getRuntime().availableProcessors();
int batchSize = arrSize/processorCount;
long startTime = System.currentTimeMillis();
final ExecutorService executorService = Executors
.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
ArrayList<Merger> mergers = new ArrayList<>();
for (int i = 0; i < processorCount; i++) {
String[] part = new String[batchSize];
System.arraycopy( unsorted, i*batchSize, part, 0, batchSize );
Merger merger = new Merger(part);
futures.add(executorService.submit(merger));
mergers.add(merger);
}
for (Future<Double> future : futures) {
future.get();
}
executorService.shutdown();
int j = 0;
String[] mergered = new String[arrSize];
for (Merger merger:mergers){
if (j == 0) {
mergered = merger.getSorted();
j+=1;
}
else{
String[] part = merger.getSorted();
mergered = SimpleMerger.merge( mergered, part);
}
}
long timeSpent = System.currentTimeMillis() - startTime;
System.out.println("Program execution time is " + timeSpent + " milliseconds");
if (arrSize < 100) {System.out.print(Arrays.toString(mergered));}
startTime = System.currentTimeMillis();
Arrays.sort(unsorted);
timeSpent = System.currentTimeMillis() - startTime;
System.out.println("\n Program (non parallel )execution time is " + timeSpent + " milliseconds");
}
рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╕рд░рдгреА рдордирдорд╛рдиреА рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рднрд░реА рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ 0 рд╕реЗ 10,000,000 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИред рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреИрдЪрд╕рд╛рдЗрдЬрд╝ рдЪрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЫрдВрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдЖрдпрд╛рдо рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдлрд┐рд░ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрдХ рд╕реЗрд╡рд╛ рдереНрд░реЗрдб рдХреА рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИредрдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рд╕ рдорд░реНрдЬ рдХрд╛ рдЕрдкрдирд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░ рдореЗрдВ рдЫрдВрдЯрдиреА рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рдХреА рдорджрдж рд╕реЗ, рд╣рдо рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╕рдм рдХреБрдЫ рдЧрдгрдирд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд░рдгреА рдХреЗ рд╕рднреА рдХреНрд░рдордмрджреНрдз рднрд╛рдЧреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рд░рдгреА рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдорд░реНрдЬ рдХрд░реЗрдВред рд╣рдо рдирд┐рд╖реНрдкрд╛рджрдХ рд╕реЗрд╡рд╛ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдордп рдХреА рд▓рд╛рдЧрдд рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВредрдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ