在线编译器 C

#include <stdio.h> int main() { const int N = 10; int A [N],i,j,c; int half=N/2; for (i=0;i<N;i++) {scanf("%d",&A[i]); } for (i=0;i<half;i++){ for (j=0;j<half;j++){ if (A[j]>A[j+1]){ c=A[j]; A[j]=A[j+1]; A[j+1]=c; } } } for (i=half;i<N;i++){ for (j=half;j<N-1;j++){ if (A[j]<A[j+1]){ c=A[j]; A[j]=A[j+1]; A[j+1]=c; } } } for (i=0;i<N;i++){ printf("%d ",A[i]); } return 0;}
这段代码的功能是:先读入10个整数,然后将数组的前半部分(前5个元素)按升序排序,后半部分(后5个元素)按降序排序,最后输出整个数组。

你的代码中有一个逻辑错误。注意看后半部分排序的循环条件:

- 你写的是 `for (j=half;j<N-1;j++)`,但后半部分需要比较和交换的元素范围是从 `half` 到 `N-1`。冒泡排序的内层循环应该遍历到 `N-1` 还是 `N-1-i` 呢?这里需要思考一下。

- 另外,后半部分排序时,内层循环的边界条件可能没有覆盖所有需要比较的相邻元素对。