Pues nada, la solución la saque metiendo un poco mas de tiempo...
Código PHP:
var a1=[1,3,-1,8,-1,2,5,9,3];
var a2=[2,-1,6,2,4,5,-1,2,-1];
function desorden_aleat(a,b) {
if(a<b) return -1;
else if(a>b) return 1;
else return 0;
}
function guardarMenosUno(arr) {
var dev=new Array();
for(var a=0; a<arr.length; a++) {
if(arr[a]==-1) {
dev[dev.length]=[a, arr[a]];
//alert("Hay un -1 en "+a);
}
}
return dev;
}
function eliminarMenosUno(arr) {
for(var a=0; a<arr.length; a++) {
if(arr[a]==-1) {
arr.splice(a,1);
a--;
}
}
}
function restaurarMenosUno(arr, arrMenosUno) {
for(var a=0;a<arrMenosUno.length;a++) {
//alert("Añadimos "+arrMenosUno[a][1]+" en "+arrMenosUno[a][0]);
arr.splice(arrMenosUno[a][0],0,arrMenosUno[a][1]);
}
}
function ordenar(arr) {
var arr_menosUno=guardarMenosUno(arr);
eliminarMenosUno(arr);
arr.sort(desorden_aleat);
restaurarMenosUno(arr, arr_menosUno);
}
document.write(a1+"<br>");
ordenar(a1);
document.write(a1+"<br><br>");
document.write(a2+"<br>");
ordenar(a2);
document.write(a2);
Se trata de guardar en un array bidimensional los elementos que queremos omitir. En el indice [0] guardo el indice original, y en el [1] guardo el valor. Luego los elimino del array a ordenar, lo ordeno, y restauro los elementos omitidos en el indice en el que estaban.
Mucho mas engorroso de lo que pensaba que se podría hacer en un principio.
Si teneis alguna sugerencia, plasmarla aqui