Метод Array.sort() работает правильно, если знать его суть: если вызвать его без параметров, то элементы будут восприниматься как строки и сортироваться в алфавитном порядке. То есть если какой-либо элемент массива не будет являться строкой, то он будет временно преобразован в строку, после чего массив будет отсортирован по алфавиту. Поэтому, в Вашем случае строки »13» и »16» идут раньше строк »2» и »5».
В случае, если требуется сортировать элементы массива как числа (в порядку возрастания или убывания), или же сортировать их в каком-либо другом порядке, тогда Вы должны передать в Array.sort() свою собственную функцию как параметр. Эту функцию часто называют функцией сравнения. Функция сравнения должна принять 2 параметра и вернуть:
Написать функцию сравнения для сортировки чисел в порядку возрастания очень просто:
function ASort (a,b) {return a-b;}
Если требуется порядок убывания:
function DSort(a,b) {return b-a;}
Теперь эти функции можно передавать в качестве параметра в Array.sort():
[16,13,2,5].sort(ASort); // Вернёт: [2,5,13,16] [16,13,2,5].sort(DSort); // Вернёт: [16,13,5,2]
На практике часто используются намного более сложные пользовательские функции сортировки.