为什么你要写两个输入...
by 明依 @ 2019-10-20 14:44:49
@[小小明](/space/show?uid=155826) 数组啊
by xzit20190507139 @ 2019-10-20 14:46:14
@[xzit20190507139](/space/show?uid=256089) 数组也不是那样读入的QWQ
by lxy__ @ 2019-10-20 14:48:15
@[b612](/space/show?uid=138280) 老师这么教的,读入n个数
by xzit20190507139 @ 2019-10-20 14:53:26
@[xzit20190507139](/space/show?uid=256089)
您的“int a[n]”后面写了个输入a[i],然后在倒数第7行又写了个输入...很明显就没有输出啊(因为程序认为你还没有把输入数据输完)
并且,由于您是从下标1开始存储的,所以数组大小应该开a[n+1]
by 明依 @ 2019-10-20 14:54:04
@[小小明](/space/show?uid=155826)
```cpp
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
int a[n];
for(i=1;i<n;i++){
scanf("%d",&a[i]);
}
int j,b,c;
for(c=n;c>1;c--){
i=n;
for(;i>1;i--){
b=a[i];
a[i]=a[i-1];
a[i-1]=b;
if(a[i]==i){
continue;
}
j=j+1;
}
}
printf("%d",j);
}
```
这样哪儿错
by xzit20190507139 @ 2019-10-20 15:11:41
@[xzit20190507139](/space/show?uid=256089)
首先,最外面那层for循环中的j=j没有必要写
由于题目要求是从小到大排序,所以在交换两个数的那三行外面应该加一个判断条件,即if(a[i]<a[i-1])那么才交换,否则这一次交换无法达到目的。
然后那个if(a[i]==i) continue窝没有看懂啊...QAQ。感觉这一句没有必要吧。
by 明依 @ 2019-10-20 15:15:27
@[xzit20190507139](/space/show?uid=256089)
修改后代码:
```cpp
#include <cstdio>
int main() {
int n, i;
scanf("%d", &n);
int a[n + 1];
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
int j = 0, b, c;
for (c = n; c > 1; c--) {
i = n;
for (; i > 1; i--) {
if (a[i] < a[i - 1]) {
b = a[i];
a[i] = a[i - 1];
a[i - 1] = b;
j = j + 1;
}
}
}
printf("%d", j);
}
```
by 明依 @ 2019-10-20 15:17:13
其中,第二层for循环可以把i>1改为i>n-c+1。因为最外层for循环每循环一次,序列的第n-c+1个数就已经确定好位置了。这样写可以快一些(如果您学过时间复杂度的话就知道了)
建议您再多康康排序的原理
by 明依 @ 2019-10-20 15:19:09
@[小小明](/space/show?uid=155826)
```cpp
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
int a[n];
for(i=1;i<n;i++){
scanf("%d",&a[i]);
}
int j,b,c;
for(c=n;c>1;c--){
i=n;
for(;i>1;i--){
if(a[i]<a[i-1]){
b=a[i];
a[i]=a[i-1];
a[i-1]=b;
}
}
j=j+1;
}
printf("%d",j);
}
```
结果是38
好像循环多了,我感觉没问题啊
by xzit20190507139 @ 2019-10-20 15:31:40