Python has a built-in [`sorted`][1] function, you should use it. What it needs to sort according to some special criteria is a `key` function: def max_digit_diff(n): n_str = str(n) return int(max(n_str)) - int(min(n_str)) This uses the fact that `"0" < "1" < ... < "9"`. However, the `sorted` function uses a stable sorting algorithm, so if two elements compare equal, the original order is preserved. But here we want the opposite order (later elements come first), so we just reverse the list first: def digit_difference_sort(a): return sorted(reversed(a), key=max_digit_diff) This should be vastly easier to read than your convoluted function. Note that the function names also follow Python's official style-guide, [PEP8][2]. Like all (good) sorting functions, this is \$\mathcal{O}(n \log n)\$. Here is a timing comparison to your function with arrays up to length 10k (at which point your function takes way too long...). [![enter image description here][3]][3] [1]: https://docs.python.org/3/library/functions.html#sorted [2]: https://www.python.org/dev/peps/pep-0008/ [3]: https://i.sstatic.net/L2ydw.png