My implementation of counting sort
Your code is not reliable because Counter is unordered.  In many cases, it comes up with the right result, but do not depend on it.  I will not give an alternate solution because Code Review is for improvements on existing code, not for writing new code.  Although your code should not be used for sorting, I have a couple comments on what you did.



You aren't using length, so why require it for an argument?

Instead of creating a copy of a list and then changing each index, create an empty list and add things to it.

Your implementation of Counter does not take advantage of it.  You use it very similarly to how you would use a dictionary.  Just use Counter(aList)

You can simplify your for key in c: loop by using itertools.repeat.  Note: don't use it for mutable objects.

Your naming is inconsistent.  PEP 8 recommends snake_case, but you use both snake_case and pascalCase.  You aren't required to comply with PEP 8's recommendation, but you should at least be consistent.  You should also use more descriptive names than c, for example.

The new code:

from collections import Counter
from itertools import repeat

def counting_sort(number_list):
    """
    counting sort does not work for negative numbers
    counting sort assumes that each element is SMALL INTEGER

    running time is O(maxVal - minVal) ---&gt; Linear

    (Useful only when the difference between maxVal and minVal is not large)
    """

    sorted_list = []
    for value, amount in Counter(number_list).items():
        sorted_list.extend(repeat(value, amount))

    return sorted_list