Check all permutations an input and see which one happens to be sorted
Ex) arr = [a, b, c]
[a, b, c] [a, c, b] [b, a, c] [b, c, a] [c, a, b] [c, b, a]
In particular, given an array with $N$ elements, there are $N!$ possible permutation to check.
Algorithm to enumerate all permutations would choose one out of $N$ elements for the first one, then it would choose one out of the remaining $N-1$ elements for the second one, and so and so forth. This would take
$N*(N-1)*(N-2)*...*1 = N!$
def swap(arr, i, j):
temp = arr[j]
arr[j] = arr[i]
arr[i] = temp
def perm(arr, idx = 0):
"""
Print out all N! permutations of the elements in an array
Parameters
----------
arr: list
This is a list we're permuting in place
idx: int
What is the index of the element we are choosing in the array
"""
if idx == len(arr)-1:
print(arr)
else:
# Assume that everything before idx is fixed, but
# we want to take something that's after idx and swap
# into idx and keep going
for i in range(idx, len(arr)):
swap(arr, i, idx) # Swap in arr[i] for arr[idx]
perm(arr, idx+1) # Keep going recursively to figure out arr[idx+1]
swap(arr, i, idx) # Swap back, and try something else
perm(['a', 'b', 'c', 'd'])