【问题标题】:Am I interpreting this pseudocode wrong?我解释这个伪代码错了吗?
【发布时间】:2014-08-19 15:36:57
【问题描述】:

我有这个伪代码:

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 )

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

【问题讨论】:

  • 伪代码很可能使用 1 索引数组,而在 C++ 中数组是 0 索引。

标签: c++ algorithm array-algorithms


【解决方案1】:

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

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

将第二个换成:

for(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]);
}

【讨论】:

  • 我没想到感谢您的建议。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 2021-12-22
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多