我解释这个伪代码错了吗?

时间:2014-06-28 19:36:06

标签: c++ algorithm array-algorithms

我有这个伪代码:

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 )

将使其按预期运行。 在伪代码中是否存在错误,或者我第一次尝试解释错误?

3 个答案:

答案 0 :(得分:4)

  

然而,这会跳过unsortedArr [0]。这意味着它不起作用。

伪代码从1开始编号数组元素几乎是通用的,而不是从0开始编号,如在C / C ++中那样

  

将第二个更改为:

     

for(int i = j - 1; i&gt; = 0; - i)

     

将使其按预期运行。

这还不够:您还需要在j处开始1而不是在外部循环中2

另请注意,C ++标准库提供了std::swap函数,负责为您交换数组元素:

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

答案 1 :(得分:3)

我认为你的伪代码假设数组以索引1开始[1] - 在C&amp; C ++从零开始[0]。

答案 2 :(得分:2)

我猜测伪代码使用的是基于1的索引,而不是C ++使用的基于0的索引。