How to express permutation as the least number of exchanges
The following should give you valid permutations, though I am not sure whether they are always minimal. At least for your second example I get the same number of swaps.
Swaps[orig_, final_] :=
Rule @@@ (Sequence@@Partition[#,2,1]& /@ First@FindPermutation[final, orig])
Swaps[{a, b, c, 1, 2, 3, 4, 5}, {3, 4, 5, 1, 2, a, b, c}]
{1->6,2->7,3->8}
Swaps[{a, b, c, 1, 2, 3, 4, 5}, {1, 2, 3, 4, a, 5, b, c}]
{1->4,4->7,7->2,2->5,3->6,6->8}
Swaps[{a, b, c, 1, 2, 3, 4, 5}, {3, 4, 5, 2, a, 1, b, c}]
{1->6,6->4,4->5,2->7,3->8}
There is some undocumented functionality you can use for the purpose:
exchanges[v1_, v2_] := Select[MapIndexed[First[#2] -> #1 &,
LinearAlgebra`LAPACK`PermutationToPivot[
InversePermutation[PermutationList[
FindPermutation[v1, v2]]]]], Apply[Unequal]]
For instance,
exchanges[{a, b, c, 1, 2, 3, 4, 5}, {3, 4, 5, 1, 2, a, b, c}]
{1 -> 6, 2 -> 7, 3 -> 8}
exchanges[{a, b, c, 1, 2, 3, 4, 5}, {1, 2, 3, 4, a, 5, b, c}]
{1 -> 4, 2 -> 5, 3 -> 6, 4 -> 7, 5 -> 7, 6 -> 8}