arrays - 此代码适用于 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;
}
解决方案
程序的行为不依赖于 的值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 {
推荐阅读
- android - 状态栏在沉浸模式下保持可见
- intellij-idea - Intelij 的输入问题
- c# - 编译 C# WPF 项目时的 MessageBox
- javascript - 单选按钮选择具有相同名称的其他组按钮
- php - 使用 PHP 向 Android 应用推送通知
- java - 杰克逊禁用@JsonFormat注解
- uitabbar - 无法在 tvOS 13 上设置 UITabBarleadingAccessoryView
- vue.js - 如何组织嵌套的 axios 调用以使其更具可读性?
- python - 来自 scipy.interpolate 的 bisplrep 和 bisplev 的问题
- elasticsearch - 检查elasticsearch查询结果是否来自缓存?