Программирование на C: reate 10 Element Array, алгоритм Bubblesort, минимальные и максимальные значения массива Return. - PullRequest
0 голосов
/ 18 мая 2018

Таким образом, настоящая проблема просто просит принять массив из 10 элементов и вернуть минимальное и максимальное значения.Я очень привык иметь дело с массивами в Matlab / GNUoctave, но сегодня я впервые связываюсь с ними в C.

В любом случае, я думаю, что мне хотелось бы знать, есть ли лучший способвведите массив, чем с помощью цикла, как я сделал.

Кроме того, я не мог понять, как получить мою пузырьковую сортировку, если блок будет продолжать циклировать до сортировки массива.Я попытался «while (;;)» безуспешно и начал искать логические переменные, но не нашел то, что искал.

Также, если есть лучший способ сделать это, я здесь, чтобы учиться.Как будто пузырчатая порода глупа для этого, я не знаю.Я подозреваю, что это так.Вероятно, потребуется больше времени для более длинного массива?

#include <stdio.h>


int main()
{
    int a[10];
    int i;
    int k;
    int temp;   


    for (i=0; i < 10; i++)
    {
        printf("Enter an integer: ");
        scanf("%d",&a[i]);
    }

    for (i=0; i < 10; i++)
    {
        if (a[i] > a[i+1])
        {
            temp = a[i];
            a[i] = a[i+1];
            a[i+1] = temp;
        }
    }
    printf("Smallest = %i\nLargest = %i\n",a[0],a[9]);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Bubble sort имеет O(n^2) сложность по времени и не требуется для этой задачи.Также ваша реализация пузырьковой сортировки неверна.Вам понадобится внешний for loop, который запускается 10 раз (или завершается, когда ни один элемент не переставлен).Я изложу гораздо более простой подход к вашей проблеме

smallest = INF  //very large value
largest = -INF  //very small value
for (i=0; i < 10; i++) {
    smallest  = min(smallest, a[i])
    largest = max(largest, a[i])
}
0 голосов
/ 18 мая 2018

Я вижу две непосредственные проблемы с вашим кодом (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;
    }
}

С тех пор я держу это отдельно, хотя лучше иметь надежный код, это частоне считается необходимым для образовательного кода.Тем не менее, вам лучше начать привыкать рано.

...