我有个伪码:
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 )
会使它按预期运行。伪码有错吗?还是我第一次试着解释错了?
发布于 2014-06-28 19:40:57
然而,这将跳过unsortedArr。这意味着它不起作用。
在C/C++中,伪码将数组元素从1 (而不是从0)编号几乎是通用的。
将第二项改为: 对于( int =j-1;i >= 0;-i) 会使它按预期运行。
这还不够:您还需要在j
上启动1
而不是外部循环中的2
。
还请注意,C++标准库提供了一个std::swap
函数,负责为您交换数组的元素:
if( unsortedArr[i] > unsortedArr[i + 1] )
{
std::swap(unsortedArr[i], unsortedArr[i+1]);
}
发布于 2014-06-28 19:38:40
我认为您的伪代码假设数组从索引1开始--在C& C++中,从0开始。
发布于 2014-06-28 19:38:47
我猜想伪代码使用的是基于1的索引,而不是C++使用的基于0的索引。
https://stackoverflow.com/questions/24470237
复制相似问题