伪代码到C ++代码

时间:2015-09-08 18:17:52

标签: c++

我需要一些帮助才能将这个伪代码转换为c ++代码

RandomizeArray(String: array[])
    Integer: max_i = *Upper bound of array*
    For i = 0 To max_i - 1
    // Pick the item for position i in the array.
    Integer: j = *pseudorandom number between i and max_i inclusive*
    *Swap the values of array[i] and array[j]*
    Next i  
End RandomizeArray

我试过这段代码,但似乎我做错了。还是正确的?

char RandomizeArray[];
int max_i = 10;
for(int i=0; i < max_i; i++)
{
     char temp;
     temp = RandomizeArray[i];
     int j = rand() % max_i + i;
     RandomizeArray[i] = RandomizeArray[j];
     RandomizeArray[j] = temp;
}

我认为这可能是正确的,但我不理解他希望我去的部分&#34;在数组中选择位置i的项目。&#34;

1 个答案:

答案 0 :(得分:1)

使用标准库函数可以做得更好吗?当然好。 至少,

temp = RandomizeArray[i];
RandomizeArray[i] = RandomizeArray[j];
RandomizeArray[j] = temp;

全部替换为

std::swap(RandomizeArray[i], RandomizeArray[j]);

整个过程被std::random_shuffle family排序(但不完全。几乎肯定是一种不同的支持算法),但这完全违背了练习的要点。

除非考官要去,“哦!他认出了这个算法,并建议节省时间!优秀!非常好!”寻找这些类型的老板。他们通常更有乐趣。

无论如何...... OP的解决方案是对伪代码的正确解释吗?

没有

查看int j = rand() % max_i + i;并在继续浏览i的值时运行j的可能值范围。

i = 0 : [0 .. max_i] 
i = 1 : [1 .. max_i + 1]
i = 2 : [2 .. max_i + 2]

注意上限正在移动,违反了伪代码的合同。从i = 1开始,j可能在RandomizeArray的范围之外,并且只会从那里开始更有可能。

稍作修改,int j = rand() % (max_i - i) + i;

i = 0 : [0 .. max_i] 
i = 1 : [1 .. max_i]
i = 2 : [2 .. max_i]

额外注意:rand很糟糕。 C++11 and better have a number of fun toys for generating much better random numbersuniform_int_distribution可能就是你想要的。