我不太明白FOR循环的伪代码
这个伪代码的正确代码(在任何语言中)是什么?
function myFunction(arr[])
for i = 0 to length(arr)
if (arr[i] > i) then
j = i
while (j < length(arr)) and (arr[j] >= j)
j = j + 1
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
i = 0
是这样的,在c#(或者Java,如果你把"Length"大写的话)中:
void myFunction(int[] arr)
{
for(int i = 0; i < arr.Length; i++)
{
if(arr[i] > i)
{
int j = i;
while(j < arr.Length && arr[j] >= j)
j = j + 1;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i = 0;
}
}
}
用while代替for:
void myFunction(int[] arr)
{
int i = 0;
while(i < arr.Length)
{
if(arr[i] > i)
{
int j = i;
while(j < arr.Length && arr[j] >= j)
j = j + 1;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i = 0;
}
i++;
}
}
注意伪代码的缩进结构:
function myFunction(arr[])
for i = 0 to length(arr)
if (arr[i] > i) then
...
这意味着for声明下面的所有内容都在循环中,而if下面的所有内容,包括将i设置为0,都将在条件块中。鉴于此事实,如果输入if语句,则必须从1重新开始。如果代码如下所示,会发生什么?
void myFunction(int[] arr)
{
int i = 0;
while(i < arr.Length)
{
if(arr[i] > i)
{
int j = i;
while(j < arr.Length && arr[j] >= j)
j = j + 1;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
i = 0;
}
}
}
在arr[i] <= i
的情况下,循环永远不会终止。
除非另有明确说明,否则应始终假定迭代循环的最后一个操作是移动索引。这是for循环必须的行为,也是while实现应该(按惯例)的行为。
代码本身看起来是一个冒泡排序实现的尝试,但是排序是基于与索引的比较,而不是与其他元素的比较。我不确定这意味着什么。