如果有人能对我的逻辑给出一些意见,我会非常感激。
对于所有键都相同,选择排序或插入排序的数组,哪种方法运行得更快?
我认为这与数组已经排序时类似,因此插入排序将是线性的,选择排序是二次的。
对于相反顺序,选择排序或插入排序的数组,哪种方法运行得更快?
我认为它们的运行方式类似,因为每个位置的值都必须改变。插入排序的最坏情况是逆序,因此这意味着它是二次的,然后选择排序也已经是二次的。
假设我们对随机排序的数组使用插入排序,其中元素只有三个值中的一个。运行时间是线性的,二次的还是介于两者之间的东西?
由于它是随机排序的,我认为这意味着插入排序必须执行多少次操作数量的值。如果是这种情况,则它不是线性的。因此,它可能是二次的,或者可能略低于二次方。
对于长度为N的数组,执行Quick.sort()期间可以交换最大项目的最大次数是多少?
最大数量不能超过可用空间的次数,因为它应该始终接近正确的位置。因此,从第一个值到最后一个值点,它将被交换N次。
关于quick.sort()在排序N个项目的数组时会有多少比较?
当绘制快速排序时,可以在每个阶段的比较对象周围绘制一个三角形,即N高和N宽,这个区域将等于执行的比较的数量,这将是(N ^ 2) )/ 2
答案 0 :(得分:2)
以下是我对您的意见的评论:
对于所有键都相同,选择排序或插入排序的数组,哪种方法运行得更快?
我认为这与数组已经排序时类似,因此插入排序将是线性的,选择排序是二次的。
是的,这是正确的。插入排序将为每个元素执行O(1)工作,并访问O(n)元素以获得O(n)的总运行时间。无论输入结构如何,选择排序总是在时间Θ(n 2 )中运行,因此它的运行时间将是二次的。
对于数组,以相反顺序,选择排序或插入排序运行哪种方法更快?
我认为它们的运行方式类似,因为每个位置的值都必须改变。插入排序的最坏情况是逆序,因此这意味着它是二次的,然后选择排序也已经是二次的。
两种算法都具有二次运行时是对的。算法实际上应该具有相对可比的性能,因为它们将进行相同的比较总数。
假设我们对随机排序的数组使用插入排序,其中元素只有三个值中的一个。运行时间是线性的,二次的还是介于两者之间的东西?
由于它是随机排序的,我认为这意味着插入排序必须执行多少次操作数量的值。如果是这种情况,则它不是线性的。因此,它可能是二次的,或者可能略低于二次方。
这应该是二次时间(时间Θ(n 2 ))。只取数组后三分之一的元素。这些元素中约有三分之一是1,并且为了将它们插入到排序序列中,它们需要移动到数组下方的2/3以上。因此,完成的工作至少是(n / 3)(2n / 3)= 2n 2 / 9,这是二次的。
对于长度为N的数组,执行Quick.sort()期间可以交换最大项目的最大次数是多少?
最大数量不能超过可用空间的次数,因为它应该始终接近正确的位置。因此,从第一个值到最后一个值点,它将被交换N次。
这里有一个错误的错误。当数组的大小为1时,最大元素不能再移动,因此移动的最大数量为N - 1.
关于quick.sort()在排序N个项目的数组时会有多少比较?
当绘制快速排序时,可以在每个阶段的比较对象周围绘制一个三角形,即N高和N宽,这个区域将等于执行的比较的数量,这将是(N ^ 2) )/ 2
这实际上取决于Quick.sort()
的实施。具有三元分区的Quicksort将仅执行O(n)总工作,因为在递归调用中排除了等于枢轴的所有值。如果没有这样做,那么你的分析就是正确的。
希望这有帮助!