코틀린 퀵소트 (https://ideone.com/Kg3VDk)

<!-- HTML generated using hilite.me -->
fun main(args: Array<String>) { val a = listOf(3, 5, 2, 3, 6, 1) println(quicksort(a)) } fun <T: Comparable<T>> quicksort(items: List<T>): List<T>{ if (items.isEmpty()) return emptyList() val pivot = items[0] val equal = items.filter { it == pivot } val less = items.filter { it < pivot } val greater = items.filter { it > pivot } return quicksort(less) + equal + quicksort(greater) }


자바 8 스트림 퀵소트

<!-- HTML generated using hilite.me -->
import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import java.util.Comparator; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.get; import static com.google.common.collect.Iterables.skip; import static com.google.common.collect.Iterables.size; import static com.google.common.base.Predicates.not; public class FunctionalQuicksort { public static <T> Iterable<T> quicksort(Iterable<T> input, final Comparator<T> comparator) { if (size(input) <= 1) { return input; } final T pivot = get(input, 0); final Iterable<T> rest = skip(input, 1); final Predicate<T> lessThan = el -> comparator.compare(el, pivot) < 0; return ImmutableList.<T>builder() .addAll(quicksort(filter(rest, lessThan), comparator)) .add(pivot) .addAll(quicksort(filter(rest, not(lessThan)), comparator)) .build(); } }

또는

<!-- HTML generated using hilite.me -->
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; public class Main { private static Function<Integer, Predicate<Integer>> smallerThan = x -> y -> y < x; public static List<Integer> qsort(List<Integer> l){ if(l.isEmpty()) return new ArrayList<>(); return Stream.concat(Stream.concat( qsort(l.stream().skip(1).filter(smallerThan.apply(l.get(0))).collect(Collectors.toList())).stream(), Stream.of(l.get(0))), qsort(l.stream().skip(1).filter(smallerThan.apply(l.get(0)).negate()).collect(Collectors.toList())).stream()) .collect(Collectors.toList()); } public static void main(String[] args) { List<Integer> l = Arrays.asList(3, 5, 2, 6, 2, 1); System.out.println(qsort(l)); } }


둘 다 구글에서 Java 8 Quicksort 검색해서 위에 있는 거 긁어왔는데 자바엔 연산자 오버로딩 없는 데다가 스트림이랑 컬렉션 변환 왔다갔다 해야 돼서 길어지는 건 둘째 치고

가독성이 저게 뭐냐...