在JavaScript中检查数字数组是否已排序

有时候,知道一个数组是按升序还是降序排序的很有用。这在与其他算法(如二分搜索排序算法)结合使用时尤其有用。

对整个数组进行排序并将其与自身进行比较是一种朴素的方法,但它非常低效。更高效的方法是使用传统的for循环和一些提前返回

从数组的前两个元素开始,计算数组的direction(方向)。如果在任何时候direction发生变化,返回0。如果数组是空的或只有一个元素,返回0。如果整个数组的direction保持不变,则返回directionMath.sign(),以获取降序为-1,升序为1

const isSorted = arr => {
  if (arr.length <= 1) return 0;
  const direction = arr[1] - arr[0];
  for (let i = 2; i < arr.length; i++) {
    if ((arr[i] - arr[i - 1]) * direction < 0) return 0;
  }
  return Math.sign(direction);
};

isSorted([0, 1, 2, 2]); // 1
isSorted([4, 3, 2]); // -1
isSorted([4, 3, 5]); // 0
isSorted([4]); // 0

[!NOTE]

相对容易修改该函数以适用于非数字数组。您可以使用localeCompare方法来处理字符串,或者对于更复杂的对象,可以使用自定义比较函数。