У меня также есть функция сортировки примерно так:
const mySortingFunction = (a, b) => {
if (a_before_b(a, b)) return 1;
if (b_before_a(a, b)) return -1;
return 0;
}
Давайте оставим a_before_b
и b_before_a
как черные ящики, так как я думаю, что они только отвлекут от проблемы.
my_unsorted_list.sort(mySortingFunction);
Это неплохая работа по сортировке моего списка. К сожалению, некоторые из примерно 100 элементов отсортированы неправильно.
Я считаю, что есть 3 возможности.
- Мои функции черного ящика несовместимы сами с собой или друг с другом
- Встроенная сортировка JavaScript не является тщательной
- Оба вышеперечисленных
Чтобы проверить вторую теорию, я вставил console.log({ a, b })
внутрь mySortingFunction
. Я думал, что хотя бы один раз для каждой возможной уникальной пары элементов массива.
Но это было гораздо меньше. Примерно в 4 раза больше элементов, чем в списке.
Я думаю, что, поскольку мои функции черного ящика не обрабатывают все возможные случаи и иногда mySortingFunction
возвращает 0
, вот что вызывает несовершенную сортировку, когда некоторые элементы находятся в положении, которое противоречит тому, что продиктовано функциями черного ящика.
Это примерно та же проблема, которую я писал о здесь .
Надеюсь, кто-нибудь сможет сказать мне, какая из перечисленных мной возможностей может быть проблемой, или есть что-то еще, что я не рассматриваю.
Для ясности, я не пытаюсь судить JavaScript встроенная сортировка. Когда я спрашиваю, «тщательно ли», я имею в виду, предназначен ли он для использования именно так, как я его использую.
Вот пример того, что я пытаюсь сделать. Как видите, даже если logi c согласован, сортировка не выполняется. Я предполагаю, что в приведенном ниже примере (хотя я еще не уверен) недостаточно условий. Но в моем примере из реальной жизни также возможно, что условия несовместимы.
Я пытаюсь выяснить, какой из них имеет место.
const sorted = ['a', 'b', 'c', 'd'];
const unsorted = ['c', 'd', 'a', 'b'];
const a_before_b = (a, b) => {
if (a == 'a' && b == 'd') return true;
if (a == 'b' && b == 'c') return true;
}
const b_before_a = (a, b) => {
if (b == 'a' && a == 'c') return true;
if (b == 'b' && a == 'c') return true;
}
const mySortingFunction = (a, b) => {
if (a_before_b(a, b)) return -1;
if (b_before_a(a, b)) return 1;
return 0;
}
console.log(unsorted.sort(mySortingFunction)); // [ 'c', 'a', 'd', 'b' ]
Обновить! Я заметил, что он отсортировал 'c'
перед 'b'
, хотя моя функция сортировки явно указывает, что этого не должно быть:
const b_before_a = (a, b) => {
if (b == 'a' && a == 'c') return true;
if (b == 'b' && a == 'c') return true; // how did c get sorted before b?
}