```#[MATL](https://esolangs.org/wiki/MATL), <s>28</s> 27 bytes

tZyZ}:w:!+-1y^7MGn/*-X:K#S)

Adapted from my answer [here](http://stackoverflow.com/a/28375839/2586922). The general idea is to create a 2D array of the same size as the input, filled with values that increase in the same order as the zig-zag path. Then the linearized (flattened) version of that array is sorted, and the _indices_ of that sorting are kept. Those are the indices that need to be applied to the input in order to produce the zig-zag path.

Input is in the form

[1 2 3; 5 6 4; 9 7 8; 1 2 3]

[__Try it online!__](http://matl.tryitonline.net/#code=dFp5Wn06dzohKy0xeV43TUduLyotWDpLI1Mp&input=WzEgMiAzOyA1IDYgNDsgOSA3IDg7IDEgMiAzXQ)

t       % input 2D array. Duplicate
ZyZ}    % get size as length-2 vector. Split into two numbers: r, c
:       % range [1,2,...,c] as a row vector
w:!     % swap, range [1;2;...;r] as a column vector
+       % add with broadcast. Gives a 2D array
-1      % push -1
y^      % duplicate previous 2D array. Compute -1 raised to that
7M      % push [1;2;...;r] again
Gn/     % divide by input matrix size, that is, r*c
*       % multiply
-       % subtract
X:      % linearize 2D array into column array
K#S     % sort and push the indices of the sorting. Gives a column vector
)       % index input matrix with that column vector```