首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    JDK7并行计算框架介绍二 Fork/Join开发实例

    package forktest; import java.util.*; import java.util.concurrent.RecursiveAction; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import junit.*; public class SortTask extends RecursiveAction {     final long[] array;     final int hi;     final int lo;     private int THRESHOLD = 30;     //构造函数     public SortTask(long[] array)     {         this.array = array;         this.lo = 0;         this.hi = array.length - 1;             }     //构造函数     public SortTask(long[] array,int lo,int hi)     {         this.array = array;         this.lo = lo;         this.hi = hi;             }     //implement RecusiveTask must     protected void compute() {         if(hi - lo < THRESHOLD) {             sequentiallySort(array,lo,hi);                      }         else         {               int pivot = partition(array,lo,hi);             System.out.println("\npivot = " + pivot + ", low = " + lo + ", high = " + hi);             System.out.println("array" + Arrays.toString(array));             //注意此处接口有变化,老版本是coInvake,已不支持该接口             invokeAll(new SortTask(array,lo,pivot-1),new SortTask(array,pivot+1,hi));           }     }     //任务分割     private int partition(long[] array,int lo,int hi){         long x = array[hi];         int i = lo - 1;         for (int j = lo; j < hi; j++) {             if (array[j] <= x) {                  i++;                  swap(array, i, j);             }         }         swap(array, i + 1, hi);         return i+1;     }     //执行排序     private void sequentiallySort(long[] array,int lo,int hi){         Arrays.sort(array,lo,hi+1);     }     //数值交换     private void swap(long[] array,int i,int j){         if(i !=j)         {             long tmp = array[i];             array[i] = array[j];             array[j] = tmp;                     }     } }

    02

    7.5.1 归并排序

    归并的含义是将两个或两个以上的有序表组合成一个新的有序表。 假定待排序表中含有N个记录,则可以看成是N个有序的子表,每个子表长度为1,然后两两归并,得到[n/2]个长度为2或1的有序表; 在两两归并,。。。如此重复,直至合并成一个长度为N的有序表为止,这种排序方法称为2-路归并排序。 下面是2路归并排序的例子: 初始关键字:【49】,【38】,【65】,【97】,【76】,【13】,【27】 一趟归并后:【38,49】,【65,97】,【76,13】,【27】 二趟归并后:【38 49 65 97】,【13 27 76】 三趟归并后:【13 27 38 49 65 76 97】 Merge()的功能是将前后相邻的两个有序表归并为一个有序表的算法。 设两段有序表A[low...mid]、A[mid+1...+high]存放在同一顺序表中相邻的位置上,将它们复制到辅助组B中。 每次从对应B中的两个段取出一个记录进行关键字的比较,将较小者放入A中, 当数组B中有一段超出其表长时(例如B[low,mid]全部被放入A中),将另一段(例如B[mid,high])中的剩余部分直接复制到A中。

    04

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券