Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   argsort cортировка в javascript (https://javascript.ru/forum/misc/60703-argsort-cortirovka-v-javascript.html)

jsNotGuru 15.01.2016 13:09

argsort cортировка в javascript
 
Как реализовать такую сортировку? Например у нас есть масив [3, 1, 2], в результате мы должны получить такое: [1, 2, 0].
объяснение: наименьший элемент в нас = 1, в масиве он находитса под индексом - 1. Потом 2, индекс = 2. И наконец наибольшее значение = 3 і оно первое есть индекс = 0.
P.S. Я хочу получить аналог argsort как в python но только в js.

рони 15.01.2016 13:20

jsNotGuru,
элементы все уникальны или есть повторы?

jsNotGuru 15.01.2016 13:22

могут быть повторы.

Яростный Меч 15.01.2016 13:36

var arr = [3, 1, 2];
var result = arr.map(function(a, i) { return i; }).sort(function(a, b) { return arr[a] - arr[b]; });
alert(result.join(", "));

jsNotGuru 15.01.2016 13:43

Спс!!!!

рони 15.01.2016 13:47

jsNotGuru,
function fn(c) {
    var d = {};
    return c.slice().sort(function(a, b) {
        return a - b
    }).map(function(a) {
        var b = d[a] || 0,
            b = c.indexOf(a, b);
        d[a] = b + 1;
        return b
    })
};
alert(fn([3, 1, 2]))
alert(fn([3, 3, 1, 2]))

рони 15.01.2016 13:49

Яростный Меч,
:victory: твой вариаант проще :)

Keramet 15.01.2016 16:14

function sortInd(arr) {
				var isSort, arrInd = [], i, len, temp;
				
				for (i = 0, len = arr.length; i < len; i++) {
					arrInd.push(i);
				}
				do {
					isSort = true;
					for(i = 0; i < len - 1; i++) {
						if (arr[i] > arr[i + 1]) {
							isSort = false;
							temp = arr[i];
							arr[i] = arr[i + 1];
							arr[i + 1] = temp;
							temp = arrInd[i];
							arrInd[i] = arrInd[i + 1];
							arrInd[i + 1] = temp;
						}
					}
				} while (isSort);
				return arrInd;
			}
			alert(sortInd([3, 1, 2]));


Часовой пояс GMT +3, время: 18:15.