nilang 0.4.1

A scripting language interpreter for Advent of Code
Documentation
fn partition(A, lo, hi) {
  // Use median-of-three pivot selection for better performance
  mid = lo + ((hi - lo) / 2);

  // Sort lo, mid, hi and use middle value as pivot
  if A[lo] > A[mid] {
    t = A[lo];
    A[lo] = A[mid];
    A[mid] = t;
  }
  if A[lo] > A[hi] {
    t = A[lo];
    A[lo] = A[hi];
    A[hi] = t;
  }
  if A[mid] > A[hi] {
    t = A[mid];
    A[mid] = A[hi];
    A[hi] = t;
  }

  pivot = A[mid];

  i = lo - 1;
  k = hi + 1;

  while true {
    i = i + 1;
    k = k - 1;

    while A[i] < pivot {
      i = i + 1;
    }

    while A[k] > pivot {
      k = k - 1;
    }

    if i >= k {
      return k;
    }

    t = A[i];
    A[i] = A[k];
    A[k] = t;
  }
}

fn inner_quicksort(A, lo, hi) {
  if lo < hi {
    p = partition(A, lo, hi);
    inner_quicksort(A, lo, p);
    inner_quicksort(A, p + 1, hi);
  }
}

fn sort(numbers) {
  inner_quicksort(numbers, 0, #numbers - 1);
  return numbers;
}

unsorted_list = [3, 5, 9, 0, 8, 7, 4, 6, 2, 1];

print(unsorted_list);

sort(unsorted_list);

print(unsorted_list);