使用Fork/Join框架优化归并排序
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                使用Fork/Join框架优化归并排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                Fork/Join框架是一個非常有意思的并發框架,它非常適合于處理類似歸并排序這種將大的問題分解成多個小問題,并將結果進行合并的情況,這次我們就使用Fork/Join框架來優化我們的歸并排序。查看更多有關Fork/Join框架的知識,請點擊這里;
首先為了與普通單線程歸并排序對比,我們先來寫一個傳統的歸并排序:
import java.util.Arrays;public class Test {private int[] array;public Test(int[] array){this.array = array;}public void sort(){if (array.length < 2) {return;}int middle = (int)(array.length)/ 2;int[] left = Arrays.copyOfRange(array, 0, middle);int[] right = Arrays.copyOfRange(array, middle, array.length);Test t1 = new Test(left);t1.sort();Test t2 = new Test(right);t2.sort();merge(left, right);}private void merge(int[] left, int[] right) {int i = 0,j = 0,m = 0; while (i < left.length && j < right.length) {if(left[i] <= right[j]){ array[m] = left[i];i++;}else{array[m] = right[j];j++;}m++;}while (i < left.length) {array[m] = left[i];i++;m++;}while (j < right.length) {array[m] = right[j];j++;m++;}} }下面來寫一個使用Fork/Join框架的歸并排序:
import java.util.Arrays; import java.util.concurrent.RecursiveAction;public class Tesk extends RecursiveAction{private static final long serialVersionUID = 6876633274768462482L;private int[] array;public Tesk(int[] array){this.array = array;}@Overrideprotected void compute() {if(array.length < 2){return;}else{int mid = (int)(array.length)/2;int[] left = Arrays.copyOfRange(array, 0, mid);int[] right = Arrays.copyOfRange(array, mid, array.length);Tesk t1 = new Tesk(left);Tesk t2 = new Tesk(right);invokeAll(t1, t2);merge(left, right);}}private void merge(int[] left, int[] right) {int i = 0,j = 0,m = 0; while (i < left.length && j < right.length) {if(left[i] <= right[j]){array[m] = left[i];i++;}else{array[m] = right[j];j++;}m++;}while (i < left.length) {array[m] = left[i];i++;m++;}while (j < right.length) {array[m] = right[j];j++;m++;}}}使用方式:
ForkJoinPool pool = new ForkJoinPool(); Tesk task = new Tesk(array); pool.invoke(task);在寫法上我盡量使兩者保持一致,比如都是將需要排序的數組作為構造參數,并且會直接在原數組上修改為排好序的數組。
我的電腦是雙核的,使用了一千萬個數據做測試,最終普通歸并排序平均大概使用了1350ms,使用了Fork/Join框架的歸并排序平均大概使用了1050ms。如果使用更多的數字這個差距還會更明顯,比如又測試了三千萬個數字,性能大概提升了1000ms。雖然排序時間受很多因素影響,但是還是可以看出來Fork/Join框架對歸并排序的優化的。特別是數據特別多的時候,如果這個時候電腦是多核的不妨使用Fork/Join來提升排序速度。
總結
以上是生活随笔為你收集整理的使用Fork/Join框架优化归并排序的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: JMM中的原子性、可见性、有序性和vol
- 下一篇: 三向切分快速排序
