Как получить ключи отсортированных значений в массиве - PullRequest
4 голосов
/ 01 июля 2011

Если у меня есть следующий массив: [5, 1, -7, 3, 6, 8, 0, -1, -3]

Сортируя его, я получаю [-7, -3,-1, 0, 1, 3, 5, 6, 8]

Хорошо, но мне нужны ключи для массива при сортировке.Это: [2, 8, 7, 6, 1, 3, 0, 4, 5]

Я попробовал следующее, используя сортировку вставкой, но, конечно, это неправильно.

var arr = [5, 1, -7, 3, 6, 8, 0, -1, -3];
keys = new Array(arr.length);
for(var j = 1; j < arr.length; j++) {
    key = arr[j];
    var i = j - 1;
    while(i >= 0 && arr[i] > key) {
        keys[i+1] = i;
        i--;
    }
    arr[i+1] = key;
    keys[i+1] = j;
}

Я на правильном пути?Можете ли вы помочь мне здесь:)

Ответы [ 3 ]

3 голосов
/ 01 июля 2011

Возможно, вы не захотите сортировать массив, просто верните массив отсортированных индексов -

var A= [5, 1, -7, 3, 6, 8, 0, -1, -3], i, L=A.length, B=[];

for(i=0;i<L;i++) B[i]=[A[i],i];

B.sort(function(a,b){return a[0]-b[0]});

for(var i=0;i<L;i++)B[i]=B[i].pop();

A+'\n'+ B

возвращаемое значение:

5,1, -7,3,6,8,0, -1, -3

2,8,7,6,1,3,0,4,5 // индексы порядка сортировки

3 голосов
/ 01 июля 2011

Попробуйте описать то, что описано на этой страницемассив), затем сортируйте их по ключу.

1 голос
/ 01 июля 2011
var arr = [5, 1, -7, 3, 6, 8, 0, -1, -3];

// Create an array that pairs the values with the indices
for (var paired=[],i=0,len=els.length;i<len;++i) paired[i] = [arr[i],i];
// result: [[5,0],[1,1],[-7,2],[3,3],[6,4],[8,5],[0,6],[-1,7],[-3,8]]

// Sort that array by the values (first element)
paired.sort(function(a,b){ a=a[0]; b=b[0]; return a<b?-1:a>b?1:0; });
// result: [[-7,2],[-3,8],[-1,7],[0,6],[1,1],[3,3],[5,0],[6,4],[8,5]]

// Create another array that has just the (now-sorted) indices (second element)
for (var indices=[],i=0;i<len;++i) indices[i] = paired[i][1];
// result: [2, 8, 7, 6, 1, 3, 0, 4, 5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...