Код AS3:
var a:Array = [0,2,0,0,0,1,1,1,0,2,0,2,0,2,0,1,0,1,1,2,1,2,1,2,0,1,2,1,0,1];
function smartSort(array:Array):Array {
var array:Array = array.concat().sort();
var elements:Array = [];
var elementsLengths:Array = [];
var totalRendomElements:int = 0;
var k:int;
for (k = 0; k < a.length; k ++) {
var el:* = array[k];
var index:int = elements.indexOf(el);
if (index == -1) {
totalRendomElements++;
elements.push(el);
index = elements.length - 1;
elementsLengths[index] = 0;
}
elementsLengths[index]++;
}
var maxGroupLength:int = elementsLengths.concat().sort()[0];
var newArray:Array = [];
for (k = 0; k < maxGroupLength; k ++) {
for (var j:int = 0; j < totalRendomElements; j ++) {
elementsLengths[j]--;
if (elementsLengths[j] >= 0) {
newArray.push(elements[j]);
}
}
}
return newArray;
}
trace(a)
trace(smartSort(a))
Особо не тестировал.