Arrays 我们如何根据两种排序算法的运行时性能在它们之间切换?

Arrays 我们如何根据两种排序算法的运行时性能在它们之间切换?,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,我正试图写一个程序,将采取一个输入数组作为输入,并将其排序。 排序将如下所示: 程序将开始使用下面提到的任何排序算法对数组的前20%进行排序。如果在20%之后,程序确定排序算法占用最坏情况时间,则程序将切换到其他排序算法,并继续使用该排序算法对数组进行排序。 我在这里面临的问题是如何知道排序算法是否占用了最坏的时间 我将使用的排序算法有: 快速排序, 合并排序, 荞麦 任何形式的帮助都会非常感激。您所说的“排序数组的前20%”是什么意思 我认为,无论您的意思是什么,都需要首先拥有数组的排序版本,

我正试图写一个程序,将采取一个输入数组作为输入,并将其排序。 排序将如下所示:


程序将开始使用下面提到的任何排序算法对数组的前20%进行排序。如果在20%之后,程序确定排序算法占用最坏情况时间,则程序将切换到其他排序算法,并继续使用该排序算法对数组进行排序。 我在这里面临的问题是如何知道排序算法是否占用了最坏的时间

我将使用的排序算法有:

快速排序, 合并排序, 荞麦

任何形式的帮助都会非常感激。

您所说的“排序数组的前20%”是什么意思

我认为,无论您的意思是什么,都需要首先拥有数组的排序版本,以便您可以检查数组的排序程度。那么,如何在不必首先对数组进行排序的情况下得到排序后的版本呢?这就像鸡和蛋的问题

回到你的主要问题,据我记忆所及,大多数排序算法都根据复制操作的数量来分析其运行时复杂性。例如,插入排序需要许多复制操作,因为当需要在正确的位置插入图元时,必须移动图元。根据交换操作的数量分析其他算法,交换操作也可以分解为3个复制操作

但是,正如我上面提到的,我不知道如何将数组定义为x%已排序,也不知道如何在没有先排序数组的情况下测量这样的排序级别。

你所说的“排序数组的前20%”是什么意思

我认为,无论您的意思是什么,都需要首先拥有数组的排序版本,以便您可以检查数组的排序程度。那么,如何在不必首先对数组进行排序的情况下得到排序后的版本呢?这就像鸡和蛋的问题

回到你的主要问题,据我记忆所及,大多数排序算法都根据复制操作的数量来分析其运行时复杂性。例如,插入排序需要许多复制操作,因为当需要在正确的位置插入图元时,必须移动图元。根据交换操作的数量分析其他算法,交换操作也可以分解为3个复制操作


但是,正如我上面提到的,我不知道如何将数组定义为x%排序,也不知道如何在没有排序数组的情况下测量排序级别。

使用堆排序最坏情况下的时间复杂度nlogn和常量空间

使用堆排序最坏情况时间复杂度nlogn和常量空间

首先,快速排序是数组的首选算法,而合并是列表的首选算法,主要是因为合并排序需要O(N)个额外内存

解决这个问题的一个方法可能是首先进行快速排序,然后每次拆分时,首先检查数组中有多少不同的元素。如果该数字相对较小,则执行bucketsort,否则继续快速排序

要找到阈值,可以对不同长度和分布的随机数组进行大量测试,并比较快速排序和桶排序的性能。在制作测试阵列时,尽量模拟您的使用场景。这样,您就可以在一定程度上错误地确定数组中不同元素数量的阈值


在大多数情况下,我使用了1000个不同元素的阈值,但是这取决于您的使用场景,因此执行测试是最好的选择。

首先,快速排序是数组的首选算法,而合并是列表的首选算法,主要是因为mergesort需要O(N)个额外内存

解决这个问题的一个方法可能是首先进行快速排序,然后每次拆分时,首先检查数组中有多少不同的元素。如果该数字相对较小,则执行bucketsort,否则继续快速排序

要找到阈值,可以对不同长度和分布的随机数组进行大量测试,并比较快速排序和桶排序的性能。在制作测试阵列时,尽量模拟您的使用场景。这样,您就可以在一定程度上错误地确定数组中不同元素数量的阈值


在大多数情况下,我使用了1000个不同元素的阈值,但是这取决于您的使用场景,因此执行测试是最好的选择。

查找“introsort”。对于bucket sort,您可以查找元素在各个bucket中的分布。对于快速排序,您可以在分区步骤之后查看轴的位置。合并排序的最坏情况复杂度与其平均复杂度相同,因此它实际上不适合作为这种混合方法中的第一个算法。计算反转数只需要一次线性过程。查找“introsort”。对于bucket sort,您可以查找元素在bucket中的分布。对于快速排序,您可以在分区步骤之后查看轴的位置。合并排序的最坏情况复杂度与其平均复杂度相同,因此它并不适合作为此混合方法中的第一个算法。计算反转数只需一次线性过程。感谢您的建议。我计划随机选择第一个算法,一旦算法对数组的前20%进行排序,我就有了时间复杂度和执行时间。现在我被困在这里,因为我无法将时间复杂度与实际执行时间进行比较,从而切换到其他算法。感谢您的建议。我计划随机选择第一个算法,一旦算法对数组的前20%进行排序,我就有了时间复杂度