2017-03-15 31 views
0

这里我有已经创建了一个新的array插入排序的Java叠加

{18,45,33,65,76,32,96,12,46,68}

现在,我在此array上使用插入排序。但我在想什么。

在某些时候,我们作为人类只能通过观察才能知道在array中发生了多少次迭代,对吧?

例如,假设,在我们已经使用插入排序该新取得的程序重复在arrayarray几次点:

{18,33,45,65,76,32 ,96,12,46,68}

只是看,是不是不可能知道计算机做了多少比较?我问我的老师,她说,看看这个新的array,很明显新的array被计算机比较了多少次。 I.E.,只要看看这个新的array,我的老师就可以知道它已经迭代了多少次。

怎么样?难道不可能确定吗?她说这是一个具体的数字。有人可以解释新的array进行了多少次比较?

+3

每次迭代后打印数组,迭代次数有限,因此数量有限。但是,数组可能处于插入排序的多次迭代状态。 –

回答

1

这是不可能的。有时你可以非常仔细地把它放下来,特别是如果你知道原始数组的话,但是通过查看数组状态你不能得到确切的数字。例如,如果您不知道原始数组的状态,并且查看并看到数组的前6个元素已排序,则可以在算法完成前6个状态后查看状态元素。但是,这些元素也可能从一开始就看起来像这样,并且在算法完成任何事情之前或在算法结束前3个元素之后,您可能正在查看状态。你真正知道的是它还没有完成第七个元素的工作。

如果您确实知道原始数组的状态,那么您通常可以精确地确定已排序了多少数组,并因此已经过了多少次迭代。但是,并非所有迭代都会影响阵列状态。例如,如果数组已经排序,则数组状态永远不会改变。另外,可能无法判断算法是否处于迭代过程中。

+0

那么我的老师是错的呢?这是一个测试问题,我们有两条信息(它显示的两个数组)。这个问题让我们想知道发生了多少次迭代。我说这是无法确定的。这意味着我说得对,对吗?仅仅通过查看这两部分知识就无法完全确定它。 –

+0

@SulemanQamar:了解原始状态和当前状态,并且知道它们是问题中显示的特定状态,可以判断已经通过了2-4次迭代(假设您的插入排序变体从第一个元素开始迭代)。我们无法确定任何更具体的内容。 – user2357112

+0

如果你的老师教了一些插入排序变体,它会跳过不会做任何事情的迭代,你可能会得到更具体的。 – user2357112

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],所以有1个比较和另一个如果你数j > 0。 由于前一个元素较小,而不是较大,因此while循环处于保留状态,for循环开始其下一次迭代。

那里有arr[2],它是33,与它的前任arr[1]比较,因为它比较小,所以它被交换。然后将其与arr[0]进行比较。它是更大的,所以这一时刻离开了。

这是将数组从状态1更改为状态2所需的最小值。但是接下来的两次迭代算法将尝试在65和76中进行排序,因此不会改变状态,因此算法完全有可能进展到76.

只有下一步会改变状态更进一步,因为它将排列在32.