這是桶排序的Java 平行計算版本,隨著生成的隨機整數的復雜度增加,也就是生成區間的不斷擴大,加速比會明顯增長。數據樣本太簡單的話,無法體現平行計算的威力。特此聲明:桶排序平行化的基本思路來自于: Professor Ian Bond in Massey University. 初始版本用CPP+MPI 編寫,我本人用Java重寫了基本算法,而且增加了自己的算法,數據進桶等比例縮小和出桶時的等比例放大. 目前,只開了4個線程,讀者可以根據自身情況手動增加線程,但是需要修改代碼。你不能用循環動態建立線程,很慢! 這是初始版本,后期需要優化,也就是繼續加速,增大加速比. 平行化是否成功的關鍵就是看加速比:linear time / parallel time
-Xms18024M -Xmx18024M 請注意,推薦內存 32 G,你可以根據自己的內存調整隨機整數生成區間,當心JVM heap out of memory.
publicclassMyTimer{privatestaticlong begin;publicstaticvoidtime_start(){begin = System.nanoTime();}publicstaticdoubletime_end_milli_seconds(){return System.nanoTime()-begin/1e6;}publicstaticdoubletime_end_seconds(){double total_time =(System.nanoTime()-begin)/1e6;return((double)((int)total_time))/1000;}}import java.util.ArrayList;import java.util.List;import java.util.Random;publicclassRandomGenerator{publicstaticint[]random_generate(int min,int max,int numtrials){int[] int_array =newint[numtrials];Random random =newRandom();for(int i =0; i < numtrials; i++){int random_num = random.nextInt(max)%(max-min+1)+ min;int_array[i]= random_num;}return int_array;}}import java.util.ArrayList;import java.util.List;publicclassBucketSort{publicint[]bucket_sort(int[] original_array,int max){// index: 0-99 but max is : 100 . the point is the array index for bucketsortint[] store_array =newint[max+1];for(int i =0; i < original_array.length; i++){int int_num = original_array[i];// here is the miracle of bucketsortstore_array[int_num]=++store_array[int_num];}int[] final_sorted_array =newint[original_array.length];int cherry_pointer =0;for(int cherry =0; cherry < store_array.length; cherry++){int cherry_num = store_array[cherry];for(int j =0; j < cherry_num; j++){final_sorted_array[cherry_pointer]=cherry;++cherry_pointer;}}return final_sorted_array;}}publicclassSmallBucketThreadextendsThread{publicint[] original_array;publicint[] final_sorted_array;publicint bucket_num;publicint bucket_size;publicintshrink_number(int item,int bucket_num,int bucket_size){return item-(bucket_num*bucket_size);}publicintrecover_number(int item,int bucket_num,int bucket_size){return item+(bucket_num*bucket_size);}publicSmallBucketThread(int[] original_array,int bucket_num,int bucket_size){this.original_array = original_array;final_sorted_array =newint[original_array.length];this.bucket_num = bucket_num;this.bucket_size = bucket_size;}@Overridepublicvoidrun(){bucket_sort_parallel(original_array,bucket_size);}publicvoidbucket_sort_parallel(int[] original_array,int max){// index: 0-99 but max is : 100 . the point is the array index for bucketsortint[] store_array =newint[max+1];for(int i =0; i < original_array.length; i++){// empty item in array is : 0if(original_array[i]!=0){// 71 -> 21 , 89->14 , save physical memoryint int_num =shrink_number(original_array[i],bucket_num,bucket_size);// here is the miracle of bucketsortstore_array[int_num]=++store_array[int_num];}}int cherry_pointer =0;// loop the cherry store....for(int cherry =0; cherry < store_array.length; cherry++){int cherry_num = store_array[cherry];for(int j =0; j < cherry_num; j++){final_sorted_array[cherry_pointer]=recover_number(cherry,bucket_num,bucket_size);++cherry_pointer;}}}}import java.util.ArrayList;import java.util.List;publicclassBucketSortParallel{publicdoublebucket_sort_parallel(int min_cherry,int max_cherry,int cherry_total_num)throws InterruptedException {MyTimer.time_start();int bucket_size = cherry_total_num/4;int[] random_array = RandomGenerator.random_generate(min_cherry,max_cherry,cherry_total_num);// 1.576 secs// System.out.println("random generated !"+MyTimer.time_end_seconds()+" s");// MyTimer.time_start();int[] arr0 =newint[cherry_total_num];int pointer0 =0;int[] arr1 =newint[cherry_total_num];int pointer1 =0;int[] arr2 =newint[cherry_total_num];int pointer2 =0;int[] arr3 =newint[cherry_total_num];int pointer3 =0;// 0.433 s// System.out.println("int[] arr generated !"+MyTimer.time_end_seconds()+" s");// MyTimer.time_start();// range random number in different areas.... 1-25,26-50,51-75,76-100for(int i =0; i < random_array.length; i++){int bucket_num = random_array[i]/ bucket_size;switch(bucket_num){case0: arr0[pointer0]= random_array[i];++pointer0;break;case1: arr1[pointer1]= random_array[i];++pointer1;break;case2: arr2[pointer2]= random_array[i];++pointer2;break;case3: arr3[pointer3]= random_array[i];++pointer3;break;}}// all cherries are in the right area// System.out.println("cherry buckets are ready !"+MyTimer.time_end_seconds()+" s");// 1.401 s// MyTimer.time_start();// start parallelSmallBucketThread thread0 =newSmallBucketThread(arr0,0,bucket_size);SmallBucketThread thread1 =newSmallBucketThread(arr1,1,bucket_size);SmallBucketThread thread2 =newSmallBucketThread(arr2,2,bucket_size);SmallBucketThread thread3 =newSmallBucketThread(arr3,3,bucket_size);thread0.start();thread1.start();thread2.start();thread3.start();thread0.join();thread1.join();thread2.join();thread3.join();List list =newArrayList<int[]>();list.add(thread0.final_sorted_array);list.add(thread1.final_sorted_array);list.add(thread2.final_sorted_array);list.add(thread3.final_sorted_array);// System.out.println("parallel is done !"+MyTimer.time_end_seconds()+" s");// 1.586 sdouble time_end = MyTimer.time_end_seconds();// this.print_array(list);return time_end;}publicvoidprint_array(List list){for(int i =0; i < list.size(); i++){int[] array =(int[]) list.get(i);for(int j =0; j < array.length; j++){if(array[j]!=0)System.out.println(array[j]);}}}publicvoidprint_array(int[] array){for(int j =0; j < array.length; j++){System.out.print(array[j]+"-");}}}publicclassTestBucketSort{publicdoublelinear_bucketsort(int min,int max,int num_trails){MyTimer.time_start();BucketSort bucketSort =newBucketSort();RandomGenerator randomGenerator =newRandomGenerator();int[] random_array = randomGenerator.random_generate(min,max,num_trails);int[] sorted_array = bucketSort.bucket_sort(random_array,max);double time_end = MyTimer.time_end_seconds();/* for (int i = 0; i < sorted_array.length; i++) {System.out.println(sorted_array[i]);}*/// System.out.println("Time elapse : "+time_end+"s sorted_array.length: "+sorted_array.length);return time_end;}publicstaticvoidmain(String[] args)throws InterruptedException {int min =1;int max =1999999999;// 1.9 billionint num_trails =100000000;// 100 millionTestBucketSort testBucketSort =newTestBucketSort();double linear_time = testBucketSort.linear_bucketsort(min,max,num_trails);BucketSortParallel parallel =newBucketSortParallel();double parallel_time = parallel.bucket_sort_parallel(min,max,num_trails);System.out.println("linear_time: "+linear_time+" secs");System.out.println("parallel_time: "+parallel_time+" secs");System.out.println("speed up : "+(linear_time/parallel_time));}}