【娱乐】使用ForkJoin实现快速排序/二分查找

本文介绍了一种利用Fork/Join框架实现的快速排序算法,并行快速排序,以及二分查找算法的递归任务实现。通过ForkJoinPool进行任务调度,实现了排序与查找操作的高效并行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快排

package p18.juc;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

public class ForkJoinDemo {


    class FKQS extends RecursiveAction{

        int [] arr;
        int start;
        int end;
        FKQS(int[]arr,int start,int end){
            this.arr = arr;
            this.start = start;
            this.end = end;
        }
        @Override
        protected void compute() {
            if(end - start>0) {

                int L = start;
                int R = end;
                int temp = arr[L];
                while(L!=R) {
                    while(R>L) {
                        if(arr[R]<temp) {
                            arr[L] = arr[R];
                            break;
                        }
                        R--;
                    }
                    while(L<R) {
                        if(arr[L]>temp) {
                            arr[R] = arr[L];
                            break;
                        }
                        L++;
                    }
                }
                arr[L]=temp;
                FKQS segmentL = new FKQS(arr,start,L-1);
                FKQS segmentR = new FKQS(arr,L+1,end);
                segmentL.fork();
                segmentR.fork();
                segmentL.join();
                segmentR.join();
            }
        }
    }
    //测试代码
    public static void main(String[] args) {
        int [] arr = {8,3,4,2,6,5,0,7,2}; 
        RecursiveAction f = new ForkJoinDemo().new FKQS(arr,0,arr.length-1);
        ForkJoinPool pool = new ForkJoinPool();
        pool.invoke(f);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

二分查找

    class FKSF extends RecursiveTask<Integer>{

        int[]arr;
        int L;
        int R;
        int target;
        public FKSF(int [] arr,int L,int R,int target) {
            this.arr = arr;
            this.L = L;
            this.R = R;
            this.target = target;
        }
        @Override
        protected Integer compute() {
            if(R>=L) {
                int mid = (R+L)/2;
                if(target>arr[mid]) {
                    FKSF subTask = new FKSF(arr,mid+1,R,target);
                    subTask.fork();
                    return subTask.join();
                }else if(target<arr[mid]) {
                    FKSF subTask = new FKSF(arr,L,mid-1,target);
                    subTask.fork();
                    return subTask.join();
                }else {
                    return mid;
                }
            }else {
                return Integer.valueOf(-1);
            }
        }
    }
    //测试代码
    public static void main(String[] args) {
        int [] arr = {1,3,4,5,7,11,20,33,50}; 
        RecursiveTask<Integer> task = new FKSF(arr,0,arr.length-1,9);
        ForkJoinPool pool = new ForkJoinPool();
        int r =pool2.invoke(task);
        System.out.println(r);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值