It was pointed out to me that my previous Radix sort on my site would lose items from its list to sort so I’m posting it here with that bug fixed and with a huge improvement in performance (2x the performance when sorting 1 million 1-3 digit numbers)
So here it is in C#/Mono.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace RadixSort
{
class Program
{
static void Main(string[] args)
{
System.Random rand = new Random(System.DateTime.Now.Millisecond);
int items = 1000000; //Convert.ToInt32(args[0]);
Queue Items = new Queue();
int c = 0;
while (c <= items)
{
Items.Enqueue(rand.Next(0, 999));
c++;
}
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
Items = RadixSort(Items, 3);
sw.Stop();
Console.WriteLine("Sorted in :: " + sw.Elapsed.ToString());
Console.ReadLine();
}
static Queue RadixSort(Queue Items, int Digits)
{
int Digit = Digits - 1;
while (Digit >= 0)
{
Queue Zero = new Queue();
Queue One = new Queue();
Queue Two = new Queue();
Queue Three = new Queue();
Queue Four = new Queue();
Queue Five = new Queue();
Queue Six = new Queue();
Queue Seven = new Queue();
Queue Eight = new Queue();
Queue Nine = new Queue();
int UpperLimit = Items.Count;
int counter = 1;
while (counter <= UpperLimit)
{
int i = Convert.ToInt32(Items.Dequeue());
counter++;
switch (i.ToString().PadLeft(Digits, '0')[Digit])
{
case '0':
Zero.Enqueue(i);
continue;
case '1':
One.Enqueue(i);
continue;
case '2':
Two.Enqueue(i);
continue;
case '3':
Three.Enqueue(i);
continue;
case '4':
Four.Enqueue(i);
continue;
case '5':
Five.Enqueue(i);
continue;
case '6':
Six.Enqueue(i);
continue;
case '7':
Seven.Enqueue(i);
continue;
case '8':
Eight.Enqueue(i);
continue;
case '9':
Nine.Enqueue(i);
continue;
}
}
Items = new Queue();
foreach (int i in Zero)
{
Items.Enqueue(i);
}
foreach (int i in One)
{
Items.Enqueue(i);
}
foreach (int i in Two)
{
Items.Enqueue(i);
}
foreach (int i in Three)
{
Items.Enqueue(i);
}
foreach (int i in Four)
{
Items.Enqueue(i);
}
foreach (int i in Five)
{
Items.Enqueue(i);
}
foreach (int i in Six)
{
Items.Enqueue(i);
}
foreach (int i in Seven)
{
Items.Enqueue(i);
}
foreach (int i in Eight)
{
Items.Enqueue(i);
}
foreach (int i in Nine)
{
Items.Enqueue(i);
}
Digit--;
}
return Items;
}
}
}
I’ll probably keep updating this periodically as new improvements come to me. That and quite a few people seem to find my site looking for a radix sort on google.
Link to this post!
April 6th, 2010 at 10:27 pm
[...] Updated Radix Sort. | Free Lancers UniteFour) { Items.Enqueue(i); } foreach (int i in Five) { Items.Enqueue(i); } foreach (int i in Six) { [...]