java - 这段Fork/Join排序为什么在递归了几步后就停止了,输出并没有排序完成。
黄舟
黄舟 2017-04-17 17:34:22
[Java讨论组]
class MergerSort extends RecursiveAction {
    private int[] array;
    private int begin, end, threshold;
    protected MergerSort(int[] array, int begin, int end, int threshold) {
        this.array = array;
        this.begin = begin;
        this.end = end;
        this.threshold = threshold;
    }
    private void merger(int begin, int mid, int end) {
        int i = begin, j = mid + 1, k = 0;
        int[] temp = new int[end - begin + 1];
        while (i <= mid && j <= end) {
            if(array[i] < array[j])
                temp[k++] = array[i++];
            else
                temp[k++] = array[j++];
        }
        while(i <= mid)
            temp[k++] = array[i++];
        while(j <= end)
            temp[k++] = array[j++];
        while(--k >= 0)
            array[end--] = temp[k];
    }
    @Override
    protected void compute() {
        if (end - begin < threshold) {
            //小于阈值,使用一般排序算法
            Arrays.sort(array, begin, end + 1);
        } else {
            //使用并发归并排序
            int mid = (end - begin) / 2;
            MergerSort left = new MergerSort(array, begin, mid, threshold);
            MergerSort right = new MergerSort(array, mid + 1, end, threshold);
            left.fork();
            right.fork();
            left.join();
            right.join();
            merger(begin, mid, end);
        }
    }
}

输出:
1 1 2 2 6 7 23 23 52 56 58 8 5 4 9 4 6 4 1 8 4 14 5 798 4 56 153 321 7 56 0 3 456 23 1 65 3 454 8 63 78

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(1)
伊谢尔伦

不知道你其他部分什么样子
不过一眼看去int mid = (end - begin) / 2;明显应该是int mid = (end + begin) / 2;

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号