function loopOrder( sh, sx, sy ) {
	var idx;

	// Initialize a loop interchange index array for generating a loop order permutation:
	idx = zeroTo( sh.length );

	// Sort the input array strides in increasing order (of magnitude):
	sx = copy( sx );
	sort2ins( sx, idx );

	// Permute the shape and output array strides based on the sorted input array strides:
	sh = take( sh, idx );
	sy = take( sy, idx );

	return {
		'sh': sh,
		'sx': sx,
		'sy': sy,
		'idx': idx
	};
}
Reorders ndarray dimensions and associated strides for loop interchange.

## Notes

-   The returned object has the following properties:

    -   **sh**: dimensions sorted in loop order.
    -   **sx**: input ndarray strides sorted in loop order.
    -   **sy**: output ndarray strides sorted in loop order.
    -   **idx**: dimension indices sorted in loop order.

@param {NonNegativeIntegerArray} sh - array dimensions
@param {IntegerArray} sx - input array stride lengths
@param {IntegerArray} sy - output array stride lengths
@returns {Object} loop interchange data

@example
var sh = [ 2, 3, 4 ];

var sx = [ 12, 4, 1 ]; // row-major
var sy = [ 1, -2, 6 ]; // column-major

var o = loopOrder( sh, sx, sy );
// returns {...}

var ssh = o.sh;
// returns [ 4, 3, 2 ]

var ssx = o.sx;
// returns [ 1, 4, 12 ]

var ssy = o.sy;
// returns [ 6, -2, 1 ]

var idx = o.idx;
// returns [ 2, 1, 0 ]