2014-06-28 83 views
2

我有了這個僞代碼:我解釋這個僞碼錯了嗎?

COMPARE-EXCHANGE(A,i,j) 
    if A[i] > A[j] 
     exchange A[i] with A[j] 

INSERTION-SORT(A) 
    for j = 2 to A.length 
     for i = j-1 downto 1 
      COMPARE-EXCHANGE(A,i,i+1) 

我將它解釋爲:

void insertSort() 
{ 
    int tmp; 

    for(int j = 2 ; j < MAX ; ++j) 
    { 
     for(int i = j - 1 ; i > 0 ; --i) 
     { 
      if(unsortedArr[i] > unsortedArr[i + 1]) 
      { 
       tmp     = unsortedArr[i]; 
       unsortedArr[i]  = unsortedArr[i + 1]; 
       unsortedArr[i + 1] = tmp; 
      } 
     } 
    } 
} 

然而,將跳過unsortedArr[0]。 這意味着它不會工作。

更改第二for到:

for(int i = j - 1 ; i >= 0 ; --i) 

會使其運行如預期。 僞代碼中有錯誤還是我第一次嘗試解釋錯誤?

+2

它是可能的僞碼使用1索引的數組,而在C++陣列是0索引的。 – Gassa

回答

4

但是,這會跳過unsortedArr [0]。這意味着它不會工作。

它是從零數爲1以上的數組元素,而不是幾乎普遍用於僞代碼,如在C/C++

改變第二對給:

對(INT I = j的 - 1; i> = 0; --i)

將使其按預期運行。

這還不夠:你還需要在1而非2在外環開始j

還要注意,C++標準庫提供std::swap函數,它接受交換陣列的元件爲您的護理:

if(unsortedArr[i] > unsortedArr[i + 1]) 
{ 
    std::swap(unsortedArr[i], unsortedArr[i+1]); 
} 
+0

我沒有想到這一點欣賞的建議。 – deW1

3

我認爲你的僞代碼假設數組是以索引1開始的[1] - 其中C在C++中,它們從零開始[0]。

2

我猜測,僞代碼使用的是基於1的索引,而不是C++使用的基於0的索引。