一尘不染

检查数组是否已排序的最快方法

algorithm

考虑到从函数返回的数组非常大。

fastest测试数组是否排序的方法是什么?

最简单的方法是:

/// <summary>
/// Determines if int array is sorted from 0 -> Max
/// </summary>
public static bool IsSorted(int[] arr)
{
for (int i = 1; i < arr.Length; i++)
{
    if (arr[i - 1] > arr[i])
    {
    return false;
    }
}
return true;
}

阅读 334

收藏
2020-07-28

共1个答案

一尘不染

您将必须访问数组的每个元素,以查看是否未排序。

您的O(n)方法几乎可以达到最快的速度,而无需任何有关数组可能状态的特殊知识。

您的代码专门测试数组是否 以较小的值在较低的索引处 排序。如果那不是您想要的,您的 if 会变得稍微复杂一些。您的代码注释确实暗示了您所追求的。

如果您对可能的状态有特殊的了解(例如,您知道它通常已排序,但是可能会将新数据添加到末尾),则可以优化访问数组元素的顺序,以使测试在失败时能够更快地失败。数组未排序。

您可以利用对硬件体系结构的了解,通过对阵列进行分区,首先比较分区的边界(快速失败检查),然后在单独的线程上每个内核运行一个阵列分区(不超过3个)来并行检查阵列的多个部分。每个CPU内核1个线程)。但是请注意,如果数组分区比缓存行的大小小得多,线程将趋于相互竞争以访问包含数组的内存。多线程只会对相当大的数组非常有效。

2020-07-28