在线编译器 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) // 【ИСПРАВЛЕНО】 Простая и надежная проверка границ без риска выйти за arr[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个整数,然后对前5个元素(索引0-4)按升序排序,对后5个元素(索引5-9)按降序排序,最后输出整个数组。

代码中存在一个逻辑错误,导致第二部分的排序可能不正确。

- 第二部分排序的循环条件 `for (int j = 5; j < 9; j++)` 只执行到 `j=8`,这意味着它只比较了索引5到8之间的相邻元素,但从未比较索引8和9。因此,最后一个元素(索引9)可能没有被正确排序到它应该在的位置。

- 另外,外层循环 `for (int i = 0; i < 5 - 1; i++)` 的写法虽然能工作,但通常冒泡排序的外层循环次数是元素个数减1。这里用 `5-1` 表示4次,但内层循环的边界需要覆盖所有需要比较的对。