首页 > 解决方案 > 此代码适用于 N=348,但在 N = 349 时不起作用

问题描述

为什么这个排序代码在 N=348 下工作,但是当 N=349 程序挂起时。?没有编译错误。

#define N 348
int main(void){
  int n[N];
  int temp;

  for(int i=0;i<N;i++) n[i] = rand();

  for(int i=0 ; i<N-1;){
    if (n[i]<n[i+1]) {i++;continue;}
    else {
       temp = n[i];
       n[i] = n[i+1];
       n[i+1] = temp;
       if (i != 0) i--;
       else i++;
    }
  }

  return 0;
}

标签: arrayscsortingif-statementinfinite-loop

解决方案


程序的行为不依赖于 的值N

如果数组的两个连续元素彼此相等,由于这种情况,将出现无限循环

if (n[i]<n[i+1]) {i++;continue;}
else {

以及复合 else 语句中的这个语句

if (i != 0) i--;

即 else 语句总是在n[i]等于时执行n[i+1]

例如尝试为数组运行程序

#define N 3
//...
int n[N] = { 1, 2, 2 };

您可以通过将条件更改为来避免错误

if (n[i]<=n[i+1]) {i++;continue;}
else {

推荐阅读