插入排序Java叠加

时间:2017-03-15 22:33:07

标签: java sorting

我在这里创建了一个新的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被比较多少次了吗?

2 个答案:

答案 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中进行排序。