Java8-style Quicksort

使用Java8编程风格写的快速排序:

1、使用数组的版本:

import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Java8QuickSort {
    public static void main(String[] args) {
        Java8QuickSort quickSort = new Java8QuickSort();
        int[] initialArray = {2, 1, 3, 5, 6, 6, 7, 7, 7, 454, 321, 3, 3, 2,};

        int [] sortedArray = quickSort.sort(initialArray);

        System.out.println(Arrays.toString(sortedArray));
    }

    private int[] sort(int[] initialArray) {
        if(initialArray.length <= 1) {
            return initialArray;
        }

        int pivotIndex = initialArray.length / 2;

        int[] smaller = IntStream.of(initialArray).filter(value -> value < initialArray[pivotIndex]).toArray();
        int[] equal = IntStream.of(initialArray).filter(value -> value == initialArray[pivotIndex]).toArray();
        int[] bigger = IntStream.of(initialArray).filter(value -> value > initialArray[pivotIndex]).toArray();


        return Stream.of(IntStream.of(sort(smaller)), IntStream.of(equal), IntStream.of(sort(bigger)))
                .reduce(IntStream.empty(), IntStream::concat).toArray();
    }
}

2、使用容器的版本:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Java8QuickSort2 {
    public static void main(String[] args) {
        Java8QuickSort2 quickSort = new Java8QuickSort2();
        List<Integer> initialData = List.of(2, 1, 3, 5, 6, 6, 7, 7, 7, 454, 321, 3, 3, 2);

        List<Integer> sortedData = quickSort.sort(initialData);

        System.out.println(sortedData);
    }

    private <T extends Comparable<T>> List<T> sort(List<T> initialData) {
        if (initialData.size() <= 1) {
            return initialData;
        }

        int pivotIndex = initialData.size() / 2;

        List<T> smaller = initialData.stream().filter(t -> t.compareTo(initialData.get(pivotIndex)) < 0).collect(Collectors.toList());
        List<T> equal = initialData.stream().filter(t -> t.compareTo(initialData.get(pivotIndex)) == 0).collect(Collectors.toList());
        List<T> bigger = initialData.stream().filter(t -> t.compareTo(initialData.get(pivotIndex)) > 0).collect(Collectors.toList());


        return Stream.of(sort(smaller), equal, sort(bigger))
                .reduce(Collections.emptyList(), (left, right) -> {
                    List<T> result = new ArrayList<>();
                    result.addAll(left);
                    result.addAll(right);

                    return result;
                });
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,645评论 25 708
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,993评论 2 59
  • 一如往常 今天在店门坐了一天 我觉得在店面应该做些 有意义的东西 我一直在寻找 在店里无聊只能看看电视剧...
    人长阅读 201评论 0 0
  • 五 秋萍回到家里,心里乱得无以名状,见谁都厌烦。径直回了房间,鞋袜也不脱,倒在床上,用枕头蒙住脑袋。 春苗知道事情...
    风过瑶圃阅读 272评论 0 0
  • 树真好。高高的大树遮住了天空。 树长在河边,树长在山谷,树长在高高的山顶上。 很多很多树在一起,就叫做大森林。 树...
    苗客APP阅读 352评论 0 0