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 )

将使其按预期运行。伪代码中有错误还是我第一次尝试解释错误?

4

3 回答 3

4

但是,这将跳过 unsortedArr[0]。这意味着它不会工作。

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

将第二个更改为:

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

将使其按预期运行。

这还不够:您还需要从外循环开始j1而不是2从外循环开始。

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

if( unsortedArr[i] > unsortedArr[i + 1] )
{
    std::swap(unsortedArr[i], unsortedArr[i+1]);
}
于 2014-06-28T19:40:57.377 回答
3

我认为您的伪代码假设数组以索引一 [1] 开头——在 C 和 C++ 中,它们从零 [0] 开始。

于 2014-06-28T19:38:40.607 回答
2

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

于 2014-06-28T19:38:47.120 回答