An algorithm for stable sorting integers in linear time. Count how many of each value appear in the set, then place each value according to how many of them there are.
If, like CeeLanguage, the ProgrammingLanguage supports only arrays with indices >= 0, the numbers to be sorted must be limited to non-negative integers and the complexity is O(n+k), where k is the maximum integer in the unsorted array plus 1.
Sample code in PythonLanguage:
def counting(alist): length = len(alist) if not length: return if min(alist) < 0: raise ValueError('integer values must be >= 0') counts = [0] * (max(alist)+1) for val in alist: counts[val] += 1 for i in xrange(1, len(counts)): counts[i] += counts[i-1] # running total results = [0] * length for i in xrange(length-1, -1, -1): # loop backwards for stable sort val = alist[i] counts[val] -= 1 results[ counts[val] ] = val alist[:] = resultsCountingSort can, I think, be performed on sets of integers with negative values in languages, such as JavaScript and FortranLanguage, which support negative array indices. I should try coding this up in JavaScript to verify the previous sentence. -- ElizabethWiethoff
Or simply use the minimum that you've already computed and subtract that from every value in the counting phase, giving values from zero onwards.
Calling this "CountingSort" doesn't ring a bell offhand, do I just have a mental block? You're clearly describing basically the simplest variant of RadixSort. -- DougMerritt
Well, it's presented separately from RadixSort in my book and has nothing to do with the powers of whatever root. You count how many of each value appear in the set, then place each value according to how many of them there are. I'll come up with a larger treatment tomorrow or the day after. Right now I have to help my friend finally do his income tax returns. Feh. -- Eliz
My sympathies, I'll be patient. (P.S. good for you to help the poor procrastinator, that's a great kindness. :-) When you return, do please note which book you're talking about, and also note I don't know what "powers of whatever root" has to do with this, and also that your phrase about placement by cardinality confuses me, since that's not what I thought you were saying above. Thanks, -- Doug
Meanwhile, a quick search finds:
It is in fact a kind of RadixSort, and apparently CountingSort is a well-known name for this variant. I guess I do have a mental block on the name.MasteringAlgorithmsWithCee (OreillyAndAssociates) is the book.
Related: OrderedHash?, OrderedPerfectHash?, OrderedMinimalPerfectHash? -- DougMerritt