Алгоритм сортировки по радиксу

Мне дали несколько алгоритмов для обратного инжиниринга. Приведенный ниже алгоритм является радикальным, но я очень озадачен тем, что на самом деле происходит в коде.

Я новичок в алгоритмах и не уверен, как код сортирует элементы в массиве. Я не уверен, что биты имеют отношение к алгоритму и что такое маска. Вот код:

    ArrayList<Integer> array = CopyArray(a);
    Integer[] zerobucket = new Integer[a.size()];
    Integer[] onebucket = new Integer[a.size()];
    int i, bit;
    Integer element, mask;

    for (bit=0; bit<8; ++bit) {
        int zc = 0;
        int oc = 0;

        for(i=0; i<array.size(); ++i) {
            element = array.get(i);
            mask = 1 << bit;
            if ((element & mask) == 0) {
                zerobucket[zc++] = array.get(i);
            } else {
                onebucket[oc++] = array.get(i);
            }
        }
        for(i=0; i<oc; ++i) array.set(i,onebucket[i]);
        for(i=0; i<zc; ++i) array.set(i+oc,zerobucket[i]);
    }
    return(array);

Ответы на вопрос(4)

Ваш ответ на вопрос