我在这里创建了一个新的array
:
{18,45,33,65,76,32,96,12,46,68}
现在,我在array
上使用插入排序。但我想知道一些事情。
在某些方面,我们作为人类无法通过观察它来判断array
中有多少次迭代,对吗?
例如,想象一下,在程序使用插入排序迭代array
几次之后,我们就得到了这个新创建的array
:
{18,33,45,65,76,32,96,12,46,68}
只是通过观察,是不是不可能知道计算机进行了多少次比较?我问过我的老师,她说看到这个新的array
很明显,计算机比较了新array
的次数。 I.E.,只要通过查看这个新的array
,我的老师就可以知道它被迭代了多少次。
如何?难道不可能确定吗?她说这是一个特定的数字。有人可以解释新array
被比较多少次了吗?
答案 0 :(得分:1)
这是不可能的。你有时可以非常接近地将它固定下来,特别是如果你知道原始数组,但只是通过查看数组状态就无法获得确切的数字。
例如,如果您不知道原始数组状态,并且您看到数组的前6个元素已排序,那么您可以在算法完成前6个元素后查看状态。但是,这些元素也可能从一开始就看起来像这样,你可以在算法完成任何事情之前或者在算法完成前3个元素之后查看状态。你真正知道的是它尚未使用第7个元素。
如果您确实知道原始数组状态,您通常可以确切地知道已经排序了多少数组,因此已经传递了多少次迭代。但是,并非所有迭代都会影响阵列状态。例如,如果数组已经排序,则数组状态将永远不会更改。此外,可能无法判断算法是否处于迭代的中间。
答案 1 :(得分:0)
对于您提供的案例,可以确定插入排序算法所做的比较的上限和下限数。但这取决于实施。我的答案将基于pseudocode below。
for i = 1 to length(A)
j ← i
while j > 0 and A[j-1] > A[j]
swap A[j] and A[j-1]
j ← j - 1
end while
end for
如果您查看数组的两种状态,请调用第一个状态
{18,45,33,65,76,32,96,12,46,68}
和第二个状态二,
{18,33,45,65,76,32,96,12,46,68}
您将看到更改发生在索引1和2的数组开头。
算法从索引1开始,并将arr[1]
与其所有前任进行比较。这仅为arr[0]
,因此如果您计算j > 0
,则会有1个比较,而另一个比较。
由于前一个元素较小,而不是较大,因此保留while循环,for循环开始下一次迭代。
将arr[2]
(其为33)与其前身arr[1]
进行比较,因为它较小,因此会被交换。然后将其与arr[0]
进行比较。它更大,所以剩下的时间。
这是将数组从状态1更改为状态2所需的最小值。但是算法的下两次迭代(尝试在65和76中进行排序)不会改变状态,因此算法完全有可能进展到76.
只有下一步才能进一步改变状态,因为它会在32中进行排序。