Почему эта пузырьковая сортировка неисправна? - PullRequest
1 голос
/ 06 мая 2019

Я пробовал пару раз, и я не могу заставить свой цикл for выполнять больше одной итерации.Проект требует, чтобы я использовал переменные-указатели в качестве аргумента для программы пузырьковой сортировки.Я не включаю весь код (т. Е. Я опускаю массив ввода и операцию печати, поскольку проблема существует в самом коде сортировки пузырьков).

Я пробовал различные версии этого кода,а также вменяя параметры печати в различных областях в моем коде.Это заставило меня понять, что мое значение для моей переменной указателя «i» сразу превышает самый большой адрес в моем массиве.По некоторым причинам адреса массива принимаются как отрицательное значение.Я не уверен, как решить эту проблему.

int arr[] = { 64, 34, 25, 12, 22, 11, 90 };
int n = ARRAY_SIZE(arr);

bubbleSort(arr, n);

[SKIPPING CODE, ARRAY SIZE IS 7]

void bubbleSort(int *arr, int n) {
    int *i, q;

    if (n == 1) {
        return;
    } else {
        for (i = arr; i < (arr + n); i++) {
            if (*arr > *(arr + 1)) {
                printf("This: %d, also value of i: %d \n", *arr, *i);
                swap(*arr, *(arr + 1));
                printf("This: %d, that %d, and i: %d \n", arr, (arr + n), i);
            }
        }
        q = n - 1;
        bubbleSort(arr, q);
    }
}

Из первого оператора печати, у меня есть значение, что "* arr" и "* i" оба 64. Я пытался прежде, чтобы увидеть значения* arr и * arr + 1 после функции подкачки, и они были правильными (34 и 64 соответственно).

Вторая функция печати указывает, что i и arr оба равны "-13312", а arr + n равенна «-13284.»

Моя функция печати, которая здесь не указана, просто печатает семь 34-х строк подряд.

1 Ответ

2 голосов
/ 06 мая 2019

Код нарушается несколькими способами:

  • Вы имеете в виду элемент за концом массива. Вы должны проверить i < (arr + n - 1)
  • Вы должны использовать i вместо arr в теле цикла:

    for (i = arr; i < arr + n - 1; i++) {
         if (*i > *(i + 1)) {
             swap(*i, *(i + 1));
         }
    }
    
  • Наименование указателя i и длина q вызывают проблемы. i обычно используется для индексной переменной, и алгоритм можно записать так:

void bubbleSort(int *arr, int n) {
    for (; n > 1; n--) {
        for (int i = 0; i < n - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                int temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
            }
        }
    }
}
...