Онлайн компилятор C

#include <stdio.h> int main() { int a[10]; int i, j, temp; for (int n = 0; n < 10; n++) { scanf("%d", &a[n]); } for (i = 0; i < 5; i++) { for (j = 0; j < 5 - i; j++) { if (a[j] < a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } for (i = 0; i < 5; i++) { for (j = 5; j < 9 - i; j++) { if (a[j] > a[j + 1]) { temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } for (int n = 0; n < 10; n++) { printf("%d ", a[n]); } return 0; }
这段代码的功能是:先输入10个整数,然后对前5个元素进行降序排序,对后5个元素进行升序排序,最后输出整个数组。

代码中存在一个逻辑错误,导致排序结果可能不正确。

- 第二个排序循环中,内层循环的条件 `j < 9 - i` 有问题。当 `i=0` 时,`j` 从5到8,只比较了索引5-8和6-9,但冒泡排序需要每一轮比较到未排序部分的最后一个元素。这里的边界计算不正确,会导致后5个元素没有完全排序。

- 另外,第一个排序循环中,外层循环 `i < 5` 对于5个元素的冒泡排序来说次数过多,但不会导致错误,只是多余。主要问题在第二个排序的边界上。