我使用sort()错了吗?

时间:2018-06-17 03:36:49

标签: javascript

我正在做一些编码挑战,如果arr参数(数字数组)按升序排序,那么编写一个返回true的函数。我似乎无法弄清楚这一点,但我的代码,无论如何,总是返回真实。

function inAscOrder(arr) {
  return arr.sort() === arr;
}

3 个答案:

答案 0 :(得分:0)

您无需对数组进行排序以查看它是否已排序。只需要检查它是否已分类。

static boolean arraySortedOrNot(int arr[], int n)
{

    // Array has one or no element
    if (n == 0 || n == 1)
        return true;

    for (int i = 1; i < n; i++)    
        // Unsorted pair found
        if (arr[i-1] > arr[i])
            return false;

    // No unsorted pair found
    return true;
}

参考链接: https://www.geeksforgeeks.org/program-check-array-sorted-not-iterative-recursive/

答案 1 :(得分:0)

由于数组是一种可变数据类型,因此当您在其上调用sort方法时,arr将被修改。

因此arr.sort()将修改您的数组而不是仅返回已排序的数组。这就是为什么当你再次检查它是否等于arr时,它将是相同的排序数组。

为了解决这个问题,我建议你将arr复制到另一个数组并对其进行排序并进行测试。

答案 2 :(得分:0)

正如其他人所指出的,您的版本的一个主要问题是它使用了变异sort。虽然您可以通过插入slice(0)或其他类似的方法来克隆数组,然后编写索引索引相等测试程序来解决这个问题,但是简单地测试每个连续条目是否大于前一个条目要容易得多。

也许最优雅的方法是通过递归。这是一个例子:

const inAscOrder = (a) => a.length < 2 || (a[0] < a[1] && inAscOrder(a.slice(1)))

由于Javascript的递归深度限制,这可能对大型数组不起作用。但同一事物的迭代版本相当简单:

const inAscOrder = (a) => {
  if (a.length < 2) {return true}
  for (let i = 1; i < a.length; i++) {
    if (a[i -1] > a[i]) {return false}
  }
  return true
}