import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
final int[] array = new int[]{5, 9, 7, 2, 0, 8, 1};
sort(array, 0, array.length);
System.out.println(Arrays.toString(array));
}
static void sort(int[] array, int from, int to/*不包含*/) {
if (to - from <= 1) return;
final int p = from + (int) ((to - from - 1) * Math.random());
final int guard = array[p];
swap(array, to - 1, p);
int k = from;
for (int i = from; i < to - 1; i++) {
if (array[i] < guard) { // 由“<=”改为了“<”,待测试。03/21/2019
swap(array, i, k++);
}
}
swap(array, to - 1, k++);
System.out.println(Arrays.toString(array) + "(" + from + "," + to + ")" + "[" + k + "]" + guard);
if (to - from <= 2) return;
sort(array, from, k);
sort(array, k, to);
}
static void swap(int[] array, int i, int j) {
if (i != j) {
final int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
object MergeSort extends App {
println {
msort((x: Int, y: Int) => x < y) {
List(5, 9, 7, 2, 0, 8, 1)
} mkString ", "
}
def msort[T](less: (T, T) => Boolean)(xs: List[T]): List[T] = {
def merge(xs: List[T], ys: List[T]): List[T] =
(xs, ys) match {
case (Nil, _) => ys
case (_, Nil) => xs
case (x :: xs1, y :: ys1) =>
if (less(x, y)) x :: merge(xs1, ys)
else y :: merge(xs, ys1)
}
val n = xs.length / 2;
if (n == 0) xs
else {
val (ys, zs) = xs splitAt n
merge(msort(less)(ys), msort(less)(zs))
}
}
}