在线编译器 C

#include <stdio.h> int main() { int arr[10]; // Массив из 10 элементов // 1. Считываем 10 чисел в массив for (int i = 0; i < 10; i++) { if (scanf("%d", &arr[i]) != 1) { return 0; } } // 2. Первая половина: по ВОЗРАСТАНИЮ (индексы 0 - 4) for (int i = 0; i < 5 - 1; i++) { for (int j = 0; j < 5 - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } // 3. Вторая половина: по УБЫВАНИЮ (индексы 5 - 9) // Гарантированно обходим все пары от 5 до 8, j+1 не выходит за рамки индекса 9 for (int i = 0; i < 5 - 1; i++) { for (int j = 5; j < 9; j++) { if (arr[j] < arr[j + 1]) { // Если левый меньше, меняем местами int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } // 4. Печать итогового массива через пробел for (int i = 0; i < 10; i++) { printf("%d", arr[i]); if (i < 9) { printf(" "); } } printf("\n"); return 0; }
这段代码的功能是:读取10个整数存入数组,然后将数组的前半部分(索引0-4)按升序排序,后半部分(索引5-9)按降序排序,最后输出整个数组。

代码整体思路正确,但排序部分存在一个逻辑问题。

- 对于前半部分的升序排序,你使用了冒泡排序,但外层循环的终止条件 `i < 5 - 1` 是正确的,内层循环的终止条件 `j < 5 - i - 1` 也是正确的。然而,你只对索引0-4的元素进行了排序,但内层循环中比较的是 `arr[j]` 和 `arr[j+1]`,其中 `j` 从0开始,这确实只涉及前半部分的元素,没有问题。

- 对于后半部分的降序排序,你同样使用了冒泡排序的思路,但内层循环的写法 `for (int j = 5; j < 9; j++)` 会导致每次外层循环时,内层循环都固定从索引5遍历到8,没有像前半部分那样随着外层循环的进行而减少比较次数。这虽然不会导致错误结果,但会进行多余的比较。更关键的是,降序排序时你比较的是 `arr[j] < arr[j+1]`,这符合降序的要求(如果左边小于右边则交换),但你的内层循环范围没有像前半部分那样动态缩小,这可能导致排序不完全正确。

提示:
- 检查后半部分冒泡排序的内层循环范围。对于降序排序,每次外层循环后,最大的元素应该沉到最右边(索引9),所以内层循环的上限应该随着外层循环的进行而减小,就像前半部分那样。
- 注意后半部分内层循环的起始索引是5,但比较时涉及 `arr[j+1]`,确保 `j+1` 不会超过9。当前 `j < 9` 保证了这一点,但为了正确排序,内层循环的上限应该动态变化。