#strict 3 global func SortNumeric(int a, int b) { return a - b; } global func SortNumericInverse(int a, int b) { return -SortNumeric(a, b); } global func QSort(array& data, callback, callbackArgs) { if(callback == true) { callback = GlobalCallback("SortNumericInverse"); } else { callback ??= GlobalCallback("SortNumeric"); } // start of flattened recursive part var stack = [[0, GetLength(data) - 1]]; // stack pointer points to next empty slot for(var stackPointer = 1; stackPointer > 0; ) { var frame = stack[--stackPointer]; var left = frame[0]; var right = frame[1]; if(left < right) { // Partitioning var pPos = RandomX(left, right); var p = data[pPos]; var tmp; tmp = data[pPos]; data[pPos] = data[right]; data[right] = tmp; pPos = right; var i = left - 1; for(var j = left; j <= right; ++j) { if(Call(callback, data[j], p, callbackArgs) < 0) { ++i; tmp = data[i]; data[i] = data[j]; data[j] = tmp; } } ++i; tmp = data[i]; data[i] = data[pPos]; data[pPos] = tmp; // ----- stack[stackPointer++] = [left, i - 1]; stack[stackPointer++] = [i + 1, right]; } } // end of recursive part return data; }