Online Compiler 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) // 【ОПТИМИЗИРОВАНО】 j < 9 - i плавно уменьшает зону поиска, убирая лишние сравнения for (int i = 0; i < 5 - 1; i++) { for (int j = 5; j < 9 - i; 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个整数,然后对前5个元素(索引0-4)按升序排序,对后5个元素(索引5-9)按降序排序,最后输出整个数组。

代码中有一个逻辑错误。观察第二部分的排序循环:外层循环 `for (int i = 0; i < 5 - 1; i++)` 是正确的,但内层循环 `for (int j = 5; j < 9 - i; j++)` 有问题。当 `i` 增大时,`9 - i` 会变小,导致内层循环的结束条件提前,可能无法覆盖所有需要比较的元素对。

- 提示1:对于后5个元素的冒泡排序,内层循环的结束条件应该与前半部分类似,但需要从索引5开始,到索引9结束。检查一下 `j < 9 - i` 这个条件是否能让 `j` 遍历到索引8(即倒数第二个元素)。
- 提示2:考虑当 `i = 0` 时,内层循环 `j` 从5到8,这是正确的。但当 `i = 1` 时,`j` 从5到7,此时应该比较到索引8吗?想一想冒泡排序中,每一轮需要比较的范围是如何变化的。