2014-06-28 53 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的索引。