This does not need enumerating all tuples.
(order of tuples is different than in brute-force method)
Also the advantage is that we can replace Table with Do and produce each tuple one by one (in case the whole list of all tuples is very large).
Clear[fu] fu[order_, n_] := Block[{le = Length[order] - 1, or = order // Ordering, dif, itt, ta}, dif = Differences[order] // Negative // Boole; itt = Prepend[ Table[{x[i], x[i - 1] + dif[[i]], n}, {i, le}], {x[0], 1, n}]; ta = Table[x[i], {i, 0, le}][[or]]; Flatten[Table[ta, Evaluate[Sequence @@ itt]], le]] order = {3, 4, 2, 5, 1}; Grid[{#, fu[order, #]} & /@ Range[6], Alignment -> Left]

Version with Do. Here we print each tuple, but instead of Print any computations can be done on each tuple one-by-one.
Clear[fu2] fu2[order_, n_] := Block[{le = Length[order] - 1, or = order // Ordering, dif, itt, ta}, dif = Differences[order] // Negative // Boole; itt = Prepend[ Table[{x[i], x[i - 1] + dif[[i]], n}, {i, le}], {x[0], 1, n}]; ta = Table[x[i], {i, 0, le}][[or]]; Do[Print[ta], Evaluate[Sequence @@ itt]]] order = {3, 4, 2, 5, 1}; fu2[order, 4]
{3,2,1,1,2} {4,2,1,1,2} {4,2,1,1,3} {4,3,1,1,3} {4,3,1,2,3} {4,3,2,2,3}
Verifying that each tuple ordering is equal to the prescribed order.
(Ordering /@ fu[order, 16] // Union) == {order}
True