Я вижу две непосредственные проблемы с вашим кодом (a) .
Во-первых, для пузырьковой сортировки обычно требуется более одного прохода для сортировки всей коллекции.Каждый проход «пузырится» по одному предмету в правильном месте.
Вторая проблема заключается в том, что при сравнении предметов n
и n + 1
, n
лучше не превышать восемь вмассив из десяти элементов.
Принимая во внимание эти две вещи, самая простая (не обязательно самая эффективная) сортировка пузырьков будет:
for (int pass = 1; pass <= 10; ++pass) {
for (int idx = 0; idx < 9; ++idx) {
if (a[idx] > a[idx + 1]) {
int temp = a[idx];
a[idx] = a[idx + 1];
a[idx + 1] = temp;
}
}
}
Одна, которая выходит после прохода, заканчивающего сортировку(вместо того, чтобы делать десять проходов, несмотря ни на что) использовал бы флаг, чтобы указать это:
int madeSwap = 1; // or bool madeSwap (after #include <stdbool.h>).
while (madeSwap) {
madeSwap = 0; // false for stdbool
for (int idx = 0; idx < 9; ++idx) {
if (a[idx] > a[idx + 1]) {
int temp = a[idx];
a[idx] = a[idx + 1];
a[idx + 1] = temp;
madeSwap = 1; // true for stdbool
}
}
}
Конечно, все, что имеет значение, только если вам требуется для сортировки массива.Ваше название вопроса, кажется, указывает на это, но тело этого не делает.
Итак, если единственное требование - вернуть минимальное и максимальное значения, сортировка не требуется.Вы можете просто сделать что-то вроде:
int minVal = a[0], maxVal = a[0];
for (int idx = 1; idx < 10; ++idx) {
if (a[idx] < minVal) minVal = a[idx];
if (a[idx] > maxVal) maxVal = a[idx];
}
// minVal and maxVal now hold the minimum and maximum value respectively.
(a) На самом деле существует третья проблема, которая поднимает уродливую голову, если вы введете что-точто не int
.Если это произойдет, значение не будет установлено, и входной поток останется в состоянии, в котором он находился в до попытки чтения.Использование scanf
должно обычно всегда проверять код возврата, например:
for (int i = 0; i < 10; i++) {
printf("Enter an integer: ");
if (scanf("%d", &a[i]) != 1) {
puts("Invalid data in input stream, will exit.");
return 1;
}
}
С тех пор я держу это отдельно, хотя лучше иметь надежный код, это частоне считается необходимым для образовательного кода.Тем не менее, вам лучше начать привыкать рано.