Как правильно сортировать массив целых чисел

попытка получить наибольшее и наименьшее значение из массива, который, как я знаю, будет содержать только целые числа, кажется сложнее, чем я думал.

var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)

Я ожидал, что это шоу 99, 104, 140000. Вместо этого он показывает 104, 140000, 99. Так кажется вроде обрабатывает значения как строки.

есть ли способ получить функцию сортировки для сортировки по целочисленному значению?

14 ответов


по умолчанию метод sort сортирует элементы по алфавиту. Для сортировки численно просто добавьте новый метод, который обрабатывает числовые сортировки (sortNumber, показано ниже) -

function sortNumber(a,b) {
    return a - b;
}

var numArray = [140000, 104, 99];
numArray.sort(sortNumber);
alert(numArray.join(","));

EDIT: использование функций стрелки ES6:

numArray.sort((a, b) => a - b); // For ascending sort
numArray.sort((a, b) => b - a); // For descending sort

просто основываясь на всех приведенных выше ответах, их также можно сделать в одной строке:

var numArray = [140000, 104, 99];

// ES5
numArray = numArray.sort(function (a, b) {  return a - b;  });

// ES2015
numArray = numArray.sort((a, b) => a - b);

//outputs: 99, 104, 140000

массив.вроде лексикографическая сортировка по умолчанию для числовой сортировки предоставляет вашу собственную функцию. Вот простой пример:

function compareNumbers(a, b)
{
    return a - b;
}

numArray.sort(compareNumbers);

Также обратите внимание, что сортировка работает "на месте", нет необходимости для назначения.


этот ответ эквивалентен некоторым из существующих ответов, но ECMAScript 6 функции стрелочку обеспечивают гораздо более компактный синтаксис, который позволяет нам определить встроенную функцию сортировки без ущерба для читаемости:

numArray = numArray.sort((a, b) => a - b);

при поддержке большинство браузеров.


Я согласен с aks, однако вместо использования

return a - b;

вы должны использовать

return a > b ? 1 : a < b ? -1 : 0;

в JavaScript поведение метода sort() по умолчанию заключается в сортировке значений в массиве по алфавиту.

для сортировки по номеру вы должны определить числовую функцию сортировки (что очень просто):

...
function sortNumber(a, b)
{
  return a - b;
}

numArray = numArray.sort(sortNumber);

причина, по которой функция сортировки ведет себя так странно

С документация:

[...] массив сортируется в соответствии с кодовой точкой Unicode каждого символа значение, в соответствии со строковым преобразованием каждого элемента.

если вы печатаете значения точек Юникода массива, то он будет получить ясно.

console.log("140000".charCodeAt(0));
console.log("104".charCodeAt(0));
console.log("99".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"

это возвращает: "49, 49, 57".

49 (unicode value of first number at 140000)
49 (unicode value of first number at 104)
57 (unicode value of first number at 99)

теперь, поскольку 140000 и 104 вернули те же значения (49), он сокращает первый индекс и снова проверяет:

console.log("40000".charCodeAt(0));
console.log("04".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"
52 (unicode value of first number at 40000)
40 (unicode value of first number at 04)

если мы это отсортируем, то получим:

40 (unicode value of first number at 04)
52 (unicode value of first number at 40000)

так 104 приходит до 140000.

таким образом, окончательный результат будет:

var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)

104, 140000, 99

вывод:

sort() делает сортировку только глядя по первому индексу чисел. sort() не волнует, если целое число больше другого, он сравнивает значение Юникода цифр, и если есть два равных значения Юникода, то он проверяет, есть ли следующая цифра и сравнивает его, а также.

чтобы правильно отсортировать, вы должны передать функцию сравнения в sort() как пояснил здесь.


массив.прототип.sort () - это метод go to для сортировки массивов, но есть несколько проблем, о которых нам нужно знать.

порядок сортировки по умолчанию лексикографический, а не числовой, независимо от типов значений в массиве. Даже если массив состоит из всех чисел, все значения будут преобразованы в строку и отсортированы лексикографически.

поэтому нам нужно настроить метод sort() и reverse (), как показано ниже.

называют URL-адрес

для сортировки чисел в массиве

numArray.sort(function(a, b)
{
    return a - b;
});

для изменения чисел в массиве

numArray.sort(function(a, b)
{
    return b - a;
});

называют URL-адресом


на вопрос уже дан ответ, самый короткий путь-использовать sort() метод. Но если вы ищете больше способов сортировки массива чисел, а также любите циклы, проверьте следующее

сортировка вставками

по возрастанию:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
    var target = numArray[i];
    for (var j = i - 1; j >= 0 && (numArray[j] > target); j--) {
        numArray[j+1] = numArray[j];
    }
    numArray[j+1] = target
}
console.log(numArray);

в порядке убывания:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
    var target = numArray[i];
    for (var j = i - 1; j >= 0 && (numArray[j] < target); j--) {
        numArray[j+1] = numArray[j];
    }
    numArray[j+1] = target
}
console.log(numArray);

выбор сортировка:

по возрастанию:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length - 1; i++) {
    var min = i;
    for (var j = i + 1; j < numArray.length; j++) {
        if (numArray[j] < numArray[min]) {
            min = j;
        }
    }
    if (min != i) {
        var target = numArray[i];
        numArray[i] = numArray[min];
        numArray[min] = target;
    }
}
console.log(numArray);

в порядке убывания:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length - 1; i++) {
    var min = i;
    for (var j = i + 1; j < numArray.length; j++) {
        if (numArray[j] > numArray[min]) {
            min = j;
        }
    }
    if (min != i) {
        var target = numArray[i];
        numArray[i] = numArray[min];
        numArray[min] = target;
    }
}
console.log(numArray);

удачи


только для обычного массива значений элементов:

function sortArrayOfElements(arrayToSort) {
    function compareElements(a, b) {
        if (a < b)
            return -1;
        if (a > b)
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareElements);
}

e.g. 1:
var array1 = [1,2,545,676,64,2,24]
**output : [1, 2, 2, 24, 64, 545, 676]**

var array2 = ["v","a",545,676,64,2,"24"]
**output: ["a", "v", 2, "24", 64, 545, 676]**

для массива объектов:

function sortArrayOfObjects(arrayToSort, key) {
    function compareObjects(a, b) {
        if (a[key] < b[key])
            return -1;
        if (a[key] > b[key])
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareObjects);
}

e.g. 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}]

**output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}]**

попробуйте этот код, как показано ниже

var a = [5, 17, 29, 48, 64, 21];
function sortA(arr) {
return arr.sort(function(a, b) {
return a - b;
})
;} 
alert(sortA(a));

обновление! Прокрутите до нижней части ответа для smartSort prop добавка, которая дает еще больше удовольствия!
сортировка массивов что-нибудь!

моя личная любимая форма этой функции позволяет использовать параметр для восхождения или спуска:

function intArraySort(c, a) {
    function d(a, b) { return b - a; }
    "string" == typeof a && a.toLowerCase();
    switch (a) {
        default: return c.sort(function(a, b) { return a - b; });
        case 1:
                case "d":
                case "dc":
                case "desc":
                return c.sort(d)
    }
};

использование так же просто, как:

var ara = function getArray() {
        var a = Math.floor(Math.random()*50)+1, b = [];
        for (i=0;i<=a;i++) b.push(Math.floor(Math.random()*50)+1);
        return b;
    }();

//    Ascending
intArraySort(ara);
console.log(ara);

//    Descending
intArraySort(ara, 1);
console.log(ara);

//    Ascending
intArraySort(ara, 'a');
console.log(ara);

//    Descending
intArraySort(ara, 'dc');
console.log(ara);

//    Ascending
intArraySort(ara, 'asc');
console.log(ara);

jsFiddle


Или Пример Фрагмента Кода Сюда!

function intArraySort(c, a) {
	function d(a, b) { return b - a }
	"string" == typeof a && a.toLowerCase();
	switch (a) {
		default: return c.sort(function(a, b) { return a - b });
		case 1:
		case "d":
		case "dc":
		case "desc":
		return c.sort(d)
	}
};

function tableExample() {
	var d = function() {
			var a = Math.floor(50 * Math.random()) + 1,
				b = [];
			for (i = 0; i <= a; i++) b.push(Math.floor(50 * Math.random()) + 1);
			return b
		},
		a = function(a) {
			var b = $("<tr/>"),
				c = $("<th/>").prependTo(b);
			$("<td/>", {
				text: intArraySort(d(), a).join(", ")
			}).appendTo(b);
			switch (a) {
				case 1:
				case "d":
				case "dc":
				case "desc":
					c.addClass("desc").text("Descending");
					break;
				default:
					c.addClass("asc").text("Ascending")
			}
			return b
		};
	return $("tbody").empty().append(a(), a(1), a(), a(1), a(), a(1), a(), a(1), a(), a(1), a(), a(1))
};

tableExample();
table { border-collapse: collapse; }
th, td { border: 1px solid; padding: .25em .5em; vertical-align: top; }
.asc { color: red; }
.desc { color: blue }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table><tbody></tbody></table>

.smartSort ('asc' | 'desc')

теперь еще больше удовольствия с методом сортировки, который сортирует массив, полный нескольких элементов! В настоящее время не охватывает "ассоциативный" (он же, строковые ключи), но он охватывает все типы значений! Он не только сортирует несколько значений asc или desc соответственно, но он также будет поддерживать постоянное "положение" "групп" значений. Иначе говоря; ints всегда сначала, затем приходят строки, затем массивы (да, я делаю это многомерным!), объекты (нефильтрованное, элемент, даты), и, наконец, undefineds и нулями!

"почему?- ты спрашиваешь. Почему нет!

теперь поставляется в 2 вкусов! Первый из которых требует новых браузеров, поскольку он использует Object.defineProperty чтобы добавить метод в


попробуйте этот код:

HTML-код:

<div id="demo"></div>

JavaScript код:

<script>
    (function(){
        var points = [40, 100, 1, 5, 25, 10];
        document.getElementById("demo").innerHTML = points;
        points.sort(function(a, b){return a-b});
        document.getElementById("demo").innerHTML = points;
    })();
</script>

вот моя функция массива сортировки в библиотеке utils:

sortArray: function(array) {
    array.sort(function(a, b) {
        return a > b;
    });
},

# Let's test a string array
var arr = ['bbc', 'chrome', 'aux', 'ext', 'dog'];
utils.sortArray(arr);
console.log(arr);
>>> ["aux", "bbc", "chrome", "dog", "ext", remove: function]

# Let's test a number array
var arr = [55, 22, 1425, 12, 78];
utils.sortArray(arr);
console.log(arr);
>>> [12, 22, 55, 78, 1425, remove: function]