将已排序的数组与未排序的数组合并,以得到最终的已排序数组。更好的方法,不是显而易见的方法。
final_sorted_array=merge(sort(unsorted_array), sorted_array)
我假设 merge 步骤类似于 merge sort
,我们知道最好的情况通常受到O(n log n)的限制。我试图了解有序数据(了解有关数据的信息)在总体上如何有用。
答案 0 :(得分:0)
假设您的第一个数组称为n1
元素的A1,而第二个数组称为n2
元素的A2:
以O(n2 + c)
为代价来扩展A1的长度并将A2附加到其后,其中c
是一个常数。应用快速排序并以O( (n1+n2)*log(n1+n2) )
的其他费用进行订购。您提到您不希望采用明显的方式,但是,您希望以最佳方式完成工作。这可能是最好的方法,因为它使您仍然可以使用常规数组,这些常规数组通常是通常最快的数据结构(当然,它具体取决于您正在执行的任务)。
但是,另一种可能性是使A1成为常规数组的链接列表的插入物,出于此分析的目的,我们将不考虑将A1从常规数组转换为链接列表的成本。因此,方法是将A2的每个元素插入A1。插入排序的一种明显方法是验证A1的每个元素,然后确定插入位置,每次插入的代价为O(n1 + c)
。但是,一种更聪明的方法是对A1进行二进制搜索,以确定A2的每个元素应插入的位置,每次插入的代价为O(log(n1) + c)
。在这种情况下,将插入n2
,即总费用n2*O(log(n1) + c)
。在这种方法中,您不需要移动任何A1元素,因为我们假设您使用的是链表,因此您只需要检查这些元素即可。这就是为什么此渐近函数看起来更好的原因,此数据结构使您能够仅查看A1原始元素而无需实际移动它们。
要决定应该使用哪种方法,我建议您分析阵列合并后出现的算法,选择最适合您需求的选项。