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

时间:2016-10-04 07:20:42

标签: arrays algorithm sorting

我正在尝试编写一个程序,它将输入数组作为输入并对其进行排序。 排序将是这样的:

程序将使用下面提到的任何排序算法开始对数组的前20%进行排序。如果在20%之后,程序识别出排序算法处于最坏情况时间,程序将切换到另一个排序算法并继续使用该排序算法对数组进行排序。 我在这里遇到的问题是如何知道排序算法是否采用最坏情况时间?

我正在使用的排序算法是:

快速排序, 归并, 桶排序

任何形式的帮助都会让人欣赏。

3 个答案:

答案 0 :(得分:0)

你是什么意思"排序前20%"数组?

我认为无论你的意思是什么,首先需要有一个排序版本的数组,以便你可以检查数组的排序量。那你怎么想出排序版本而不必先排序数组呢?这就像鸡和蛋的问题。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

首先,quicksort是数组的首选算法,而merge更适合列表,主要是因为mergesort需要额外的O(N)内存。

问题的一个解决方案可能是首先执行快速排序,然后每次拆分首先检查您在阵列的部分中有多少不同的元素。如果这个数字相对较小,那么你可以使用bucketsort,否则继续快速排序。

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

在大多数情况下,我使用阈值~1000个不同的元素,但这非常依赖于您的使用场景,因此执行测试是最佳选择。