public static void radixSortLexicalFixedLsd(String words[]) {
        // 256 ASCII character positions
        final int numBuckets = 256;
        org.sheehan.algorithm.data_structures.List<QueueInterface<String>> buckets = new ListImpl<QueueInterface<String>>();
        for (int i = 0; i < numBuckets; i++){
            buckets.appendBack(new QueueArrayImpl<String>(words.length));
        }

        Integer max = Integer.MIN_VALUE;
        for (String value: words)
            max = (max < value.length()) ? value.length():max;

        // while there is a max element larger positional value, iterate another bucket sorting pass
        // moving the position from left to right by one
        for (int position=max-1; position>=0; position--) {
            //FILL BUCKETS
            // each pass checks a rt to left position and buckets based on that digit
            for (String value : words){
                char c = value.charAt(position);
                buckets.get(Character.getNumericValue(c)).enqueue(value);
            }

            //EMPTY BUCKETS into orignal array !
            // reset array to new order after sorting this pass
            // the new order is obtained by removing elements from the bucket queues in FIFO order
            // starting from least valued bucket
            int i = 0;
            for (int bucketIndex = 0; bucketIndex < numBuckets; ++bucketIndex){
                QueueInterface<String> bucket = buckets.get(bucketIndex);
                String value;
                while ((value = bucket.dequeue()) != null){
                    words[i++] = value;
                }
            }
        }
    }