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 initialData = List.of(2, 1, 3, 5, 6, 6, 7, 7, 7, 454, 321, 3, 3, 2);

        List sortedData = quickSort.sort(initialData);

        System.out.println(sortedData);
    }

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

        int pivotIndex = initialData.size() / 2;

        List smaller = initialData.stream().filter(t -> t.compareTo(initialData.get(pivotIndex)) < 0).collect(Collectors.toList());
        List equal = initialData.stream().filter(t -> t.compareTo(initialData.get(pivotIndex)) == 0).collect(Collectors.toList());
        List 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 result = new ArrayList<>();
                    result.addAll(left);
                    result.addAll(right);

                    return result;
                });
    }
}

你可能感兴趣的:(Java8-style Quicksort)