코틀린 퀵소트 (https://ideone.com/Kg3VDk)
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 검색해서 위에 있는 거 긁어왔는데 자바엔 연산자 오버로딩 없는 데다가 스트림이랑 컬렉션 변환 왔다갔다 해야 돼서 길어지는 건 둘째 치고
가독성이 저게 뭐냐...
코틀린은 변수빼서 코드 일부러 길게했는데도 더 짧네 ㅋㅋㅋㅋ
잘못했다곰