Updated Radix Sort.

April 15th, 2009
by Serinox

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.

Posted in General | Comments (1)

One Response to “Updated Radix Sort.”

  1. enqueue Says:

    [...] Updated Radix Sort. | Free Lancers UniteFour) { Items.Enqueue(i); } foreach (int i in Five) { Items.Enqueue(i); } foreach (int i in Six) { [...]

Leave a Reply

You must be logged in to post a comment.