import { Array } from "../array"; /** Obtains the default comparator for the specified type. */ export function defaultComparator(): (a: T, b: T) => i32 { return (a: T, b: T): i32 => ((a > b) - (a < b)); // compiles to a constant function index } /** Sorts an Array with the 'Insertion Sort' algorithm. */ export function insertionSort(arr: Array, comparator: (a: T, b: T) => i32): Array { var a: T, b: T, j: i32; const typeShift = alignof(); for (let i: i32 = 0, len: i32 = arr.length; i < len; i++) { a = load(arr.__memory + (i << typeShift)); // a = arr[i]; j = i - 1; while (j >= 0) { b = load(arr.__memory + (j << typeShift)); // b = arr[j]; if (comparator(a, b) < 0) { store(arr.__memory + ((j + 1) << typeShift), b); // arr[j + 1] = b; j--; } else break; } store(arr.__memory + ((j + 1) << typeShift), a); // arr[j + 1] = a; } return arr; } /** Sorts an Array with the 'Weak Heap Sort' algorithm. */ export function weakHeapSort(arr: Array, comparator: (a: T, b: T) => i32): Array { // see: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.21.1863&rep=rep1&type=pdf var len: i32 = arr.length; var i: i32, j: i32, y: i32, p: i32, a: T, b: T; const typeShift = alignof(); const intShift = alignof(); var blen = (len + 7) >> 3; var bitset = allocate_memory(blen << intShift); set_memory(bitset, 0, blen << intShift); for (i = len - 1; i > 0; i--) { j = i; while ((j & 1) == ((load(bitset + ((j >> 4) << intShift)) >> ((j >> 1) & 7)) & 1)) { j >>= 1; } p = j >> 1; a = load(arr.__memory + (p << typeShift)); // a = arr[p]; b = load(arr.__memory + (i << typeShift)); // b = arr[i]; if (comparator(a, b) < 0) { store( bitset + ((i >> 3) << intShift), load(bitset + ((i >> 3) << intShift)) ^ (1 << (i & 7)) ); store(arr.__memory + (i << typeShift), a); // arr[i] = a; store(arr.__memory + (p << typeShift), b); // arr[p] = b; } } for (i = len - 1; i >= 2; i--) { /* a = arr[0]; arr[0] = arr[i]; arr[i] = a; */ a = load(arr.__memory, 0); store(arr.__memory, load(arr.__memory + (i << typeShift)), 0); store(arr.__memory + (i << typeShift), a); let x = 1; while ((y = (x << 1) + ((load(bitset + ((x >> 3) << intShift)) >> (x & 7)) & 1)) < i) { x = y; } while (x > 0) { a = load(arr.__memory, 0); // a = arr[0]; b = load(arr.__memory + (x << typeShift)); // b = arr[x]; if (comparator(a, b) < 0) { store( bitset + ((x >> 3) << intShift), load(bitset + ((x >> 3) << intShift)) ^ (1 << (x & 7)) ); store(arr.__memory + (x << typeShift), a); // arr[x] = a; store(arr.__memory, b, 0); // arr[0] = b; } x >>= 1; } } free_memory(bitset); /* let t = arr[1]; arr[1] = arr[0]; arr[0] = t; */ var t = load(arr.__memory, sizeof()); store(arr.__memory, load(arr.__memory, 0), sizeof()); store(arr.__memory, t, 0); return arr; }