|
1 | 1 | package com.github.coderodde.util; |
2 | 2 |
|
| 3 | +import java.util.List; |
3 | 4 | import java.util.Random; |
4 | 5 |
|
5 | 6 | /** |
@@ -369,8 +370,7 @@ private static void parallelRadixSortImpl( |
369 | 370 | } |
370 | 371 | } |
371 | 372 |
|
372 | | - Random random = new Random(); |
373 | | - nonEmptyBucketIndices.shuffle(random); |
| 373 | + nonEmptyBucketIndices.shuffle(new Random()); |
374 | 374 |
|
375 | 375 | int f = 0; |
376 | 376 | int j = 0; |
@@ -401,13 +401,21 @@ private static void parallelRadixSortImpl( |
401 | 401 | } |
402 | 402 | } |
403 | 403 |
|
404 | | - ListOfBucketKeyLists listOfTaskArrays = |
405 | | - new ListOfBucketKeyLists(spawnDegree); |
| 404 | + SorterThread[] sorterThreads = new SorterThread[spawnDegree - 1]; |
406 | 405 |
|
407 | 406 | for (int i = 0; i != spawnDegree; i++) { |
408 | 407 | BucketKeyList bucketKeyList = new BucketKeyList(BUCKETS); |
| 408 | + BucketKeyList bucketKeyList2 = |
| 409 | + listOfBucketKeyLists.getBucketKeyList(i); |
| 410 | + |
| 411 | + int size = bucketKeyList2.size(); |
409 | 412 |
|
| 413 | + for (int idx = 0; idx != size; idx++) { |
| 414 | + int bucketKey = bucketKeyList2.getBucketKey(idx); |
| 415 | + SorterThread sorterThread = new SorterThread(); |
| 416 | + } |
410 | 417 |
|
| 418 | + listOfBucketKeyLists.addBucketKeyList(bucketKeyList); |
411 | 419 | } |
412 | 420 | } |
413 | 421 |
|
@@ -761,7 +769,61 @@ public void run() { |
761 | 769 |
|
762 | 770 | private static final class SorterThread extends Thread { |
763 | 771 |
|
764 | | - |
| 772 | + private final List<SorterTask> sorterTasks; |
| 773 | + |
| 774 | + SorterThread(List<SorterTask> sorterTasks) { |
| 775 | + this.sorterTasks = sorterTasks; |
| 776 | + } |
| 777 | + |
| 778 | + @Override |
| 779 | + public void run() { |
| 780 | + for (SorterTask sorterTask : sorterTasks) { |
| 781 | + if (sorterTask.threads > 1) { |
| 782 | + parallelRadixSortImpl(sorterTask.source, |
| 783 | + sorterTask.target, |
| 784 | + sorterTask.sourceStartOffset, |
| 785 | + sorterTask.targetStartOffset, |
| 786 | + sorterTask.rangeLength, |
| 787 | + sorterTask.recursionDepth, |
| 788 | + sorterTask.threads); |
| 789 | + } else { |
| 790 | + radixSortImpl(sorterTask.source, |
| 791 | + sorterTask.target, |
| 792 | + sorterTask.sourceStartOffset, |
| 793 | + sorterTask.targetStartOffset, |
| 794 | + sorterTask.rangeLength, |
| 795 | + sorterTask.recursionDepth); |
| 796 | + } |
| 797 | + } |
| 798 | + } |
| 799 | + } |
| 800 | + |
| 801 | + private static final class SorterTask{ |
| 802 | + |
| 803 | + final int[] source; |
| 804 | + final int[] target; |
| 805 | + final int sourceStartOffset; |
| 806 | + final int targetStartOffset; |
| 807 | + final int rangeLength; |
| 808 | + final int recursionDepth; |
| 809 | + final int threads; |
| 810 | + |
| 811 | + SorterTask(int[] source, |
| 812 | + int[] target, |
| 813 | + int sourceStartOffset, |
| 814 | + int targetStartOffset, |
| 815 | + int rangeLength, |
| 816 | + int recursionDepth, |
| 817 | + int threads) { |
| 818 | + |
| 819 | + this.source = source; |
| 820 | + this.target = target; |
| 821 | + this.sourceStartOffset = sourceStartOffset; |
| 822 | + this.targetStartOffset = targetStartOffset; |
| 823 | + this.rangeLength = rangeLength; |
| 824 | + this.recursionDepth = recursionDepth; |
| 825 | + this.threads = threads; |
| 826 | + } |
765 | 827 | } |
766 | 828 |
|
767 | 829 | private static final class BucketKeyList { |
|
0 commit comments