在这里,在 C#(或 Java,如果你将“长度”去掉大写):
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 实现应该如何(按照惯例)。
代码本身看起来是对冒泡排序实现的尝试,但排序是基于与索引的比较,而不是其他元素。我不确定它的目的是什么。