日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Fork/Join框架优化归并排序

發(fā)布時間:2025/4/16 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Fork/Join框架优化归并排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Fork/Join框架是一個非常有意思的并發(fā)框架,它非常適合于處理類似歸并排序這種將大的問題分解成多個小問題,并將結(jié)果進行合并的情況,這次我們就使用Fork/Join框架來優(yōu)化我們的歸并排序。查看更多有關(guān)Fork/Join框架的知識,請點擊這里;

首先為了與普通單線程歸并排序?qū)Ρ?#xff0c;我們先來寫一個傳統(tǒng)的歸并排序:

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);

在寫法上我盡量使兩者保持一致,比如都是將需要排序的數(shù)組作為構(gòu)造參數(shù),并且會直接在原數(shù)組上修改為排好序的數(shù)組。

我的電腦是雙核的,使用了一千萬個數(shù)據(jù)做測試,最終普通歸并排序平均大概使用了1350ms,使用了Fork/Join框架的歸并排序平均大概使用了1050ms。如果使用更多的數(shù)字這個差距還會更明顯,比如又測試了三千萬個數(shù)字,性能大概提升了1000ms。雖然排序時間受很多因素影響,但是還是可以看出來Fork/Join框架對歸并排序的優(yōu)化的。特別是數(shù)據(jù)特別多的時候,如果這個時候電腦是多核的不妨使用Fork/Join來提升排序速度。

總結(jié)

以上是生活随笔為你收集整理的使用Fork/Join框架优化归并排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。