2017-03-15 29 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.