在JavaScript中检查数字数组是否已排序
有时候,知道一个数组是按升序还是降序排序的很有用。这在与其他算法(如二分搜索或排序算法)结合使用时尤其有用。
对整个数组进行排序并将其与自身进行比较是一种朴素的方法,但它非常低效。更高效的方法是使用传统的for
循环和一些提前返回。
从数组的前两个元素开始,计算数组的direction
(方向)。如果在任何时候direction
发生变化,返回0
。如果数组是空的或只有一个元素,返回0
。如果整个数组的direction
保持不变,则返回direction
的Math.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
方法来处理字符串,或者对于更复杂的对象,可以使用自定义比较函数。