【问题标题】:Why Is This Bubble Sort Faulty?为什么这种冒泡排序是错误的?
【发布时间】:2019-05-06 20:28:36
【问题描述】:

我已经尝试了几次,但我的 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。

【问题讨论】:

  • 您的循环计数器是i,但您从不在循环中使用它。这里有什么想法?
  • 当我尝试与 i 一起使用它时,代码本身崩溃了。我将尝试再次集成它,看看会发生什么
  • 没关系,那个错误在代码中稍微靠后一点(我没有包括在内)。感谢您的意见。
  • 美味 - 递归冒泡排序。让我们让糟糕的算法变得更糟……为了科学。
  • swap(*arr, *(arr + 1)); -- 可疑。这些不是传递给函数的指针,所以我假设你的交换函数只是修改它作为参数传递的本地值。

标签: c for-loop bubble-sort


【解决方案1】:

代码被多种方式破坏:

  • 您指的是超出数组末尾的元素。你应该测试i &lt; (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;
            }
        }
    }
}

【讨论】:

  • 感谢您的回复。有了这个修复,我现在已经让 for 循环进行正确的迭代次数,但现在最终的数组只打印出所有 11。我只是将指针和长度名称设为任意名称,让它们指示它们实际所做的事情可能会更有帮助
  • 好的变量名有助于使代码易于理解,因此更易于调试...
  • 没关系,那个错误在代码中稍微靠后一点(我没有包括在内)。感谢您的意见。
猜你喜欢
  • 2019-12-14
  • 1970-01-01
  • 2021-12-28
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多