Ganz vorneweg - konvertieren in String, substring, und Konvertierung zurück? Das ist absolut katastrophal... Ich nehme mal an, es ist ein int- oder long-Array. Dann bekommt man die Zehner durch eine simple Division durch 10. Eventuelle Nachkommastellen werden dabei einfach fallen gelassen (7/10 ergibt ganz banal 0, 10/10 und 12/10 alle beide 1 (sodass 10/10 == 12/10 gilt...).
Es handelt sich bei der Vorsortierung offenbar um eine Variante des Bucketsort. Gibt es denn irgendeine Beschränkung, wie groß die Zahlen in unserArray sein können? Ansonsten müsste das sortedNumbers-Array ja fast 215 Mio Einträge haben (int; keine negativen Zahlen berücksichtigt!) bzw. würde definitiv den Arbeitsspeicher sprengen (long). Was ist mit negativen Zahlen? ArrayIndexOutOfBoundsException lässt grüßen...
Sind Duplikate bei den Werten erlaubt? Dann müsste gelten: sortedArray = new int[(1 << 31) / 10) + 1][unserArray.length] (wiederum ohne negative Werte zu berücksichtigen, ansonsten bräuchten wir (int)(((long)1 << 32) / 10) + 1!). Es könnte ja sein, dass das unserArray z. B. einfach nur jeweils 1000 mal die Zahlen 2010 und 2012 enthält....
Wenn es also keine sinnvollen Beschränkungen der Einzelwerte gibt, liegt die gewählte Datenstruktur irgendwo zwischen äußerst ungünstig bis komplett ungeeignet. Dann ist es sicherlich effizienter, gleich das ganze unserArray mit java.util.Arrays.sort zu sortieren ( https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(int[]) ).
Wenn es aber geeignete Begrenzungen gibt, dann komme ich gleich nochmal auf vorherigen Abschnitt zurück: Lasse die einzelnen Unter-Arrays in sortedNumbers jeweils von java.util.Arrays.sort sortieren...