(Я собираюсь игнорировать обработку ввода, его просто развлечением.)
Простой способ для сортировки.
#include <stdlib.h>
#include <stdio.h>
int cmp_int(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
int main() {
int a[] = { 1, 5, 3, 2, 0, 5, 7, 6 };
const int n = sizeof(a)/sizeof(a[0]);
qsort(a, n, sizeof(a[0]), cmp_int);
printf("%d %d\n", a[n-1], a[n-2]);
}
Но это не самый эффективный, потому что это O(n log n)
, то есть, как массив становится больше количество сравнений становится больше быстрее. Не слишком быстро, медленнее экспоненциального, но мы можем сделать лучше.
Мы можем сделать это в O(n)
или «линейное время», поскольку массив становится больше, количество сравнений растет с одинаковой скоростью.
Прокрутите массив, отслеживая максимум, это обычный способ найти максимум. Когда вы найдете новый макс, старый max становится вторым по величине номером.
Вместо того чтобы иметь второй цикл, чтобы найти второе по величине число, бросьте в специальный чехол для работы на втором по величине номере.
#include <stdio.h>
#include <limits.h>
int main() {
int a[] = { 1, 5, 3, 2, 0, 5, 7, 6 };
// This trick to get the size of an array only works on stack allocated arrays.
const int n = sizeof(a)/sizeof(a[0]);
// Initialize them to the smallest possible integer.
// This avoids having to special case the first elements.
int max = INT_MIN;
int second_max = INT_MIN;
for(int i = 0; i < n; i++) {
// Is it the max?
if(a[i] > max) {
// Make the old max the new 2nd max.
second_max = max;
// This is the new max.
max = a[i];
}
// It's not the max, is it the 2nd max?
else if(a[i] > second_max) {
second_max = a[i];
}
}
printf("max: %d, second_max: %d\n", max, second_max);
}
Там может быть более элегантный способ сделать это, но это будет делать, в большинстве, 2n сравнений. В лучшем случае это будет n.
Обратите внимание, что есть открытый вопрос, что делать с { 1, 2, 3, 3 }
. Должно ли это возвращаться 3, 3
или 2, 3
? Я оставлю это вам, чтобы решить и соответствующим образом настроить.
Отсортировать их и принимать последние два элемента.Если это какое-то упражнение, у нас просто был вопрос, похожий на этот, он получал максимум и минимум из 4-х элементов в 4 сравнениях. – Schwern
Сортировка - не лучший алгоритм, который вы могли бы использовать там. Сортировка имеет сложность O (n * log (n)) (если выполняется правильно), в то время как вы можете найти максимум в линейном времени. – Dunatotatos
Я вижу первый номер здесь с инициализацией most2. Если a [0] является наибольшим, условие во втором цикле всегда будет ложным, а наибольшее значение 1 и наибольшее 2 будут равны [0]. – Dunatotatos