c - 为什么这个冒泡排序有问题?

标签 c for-loop bubble-sort

我已经尝试了几次,但我无法让我的 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);
    }
}

从第一个 print 语句,我知道“*arr”和“*i”的值都是 64。我之前曾尝试在交换函数之后查看 *arr 和 *arr + 1 的值,它们是正确的(分别为 34 和 64)。

第二个打印函数表明 i 和 arr 都等于“-13312”并且 arr + n 等于“-13284”。

我的打印函数(此处未列出)仅连续打印出七个 34。

最佳答案

代码以多种方式被破坏:

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

关于c - 为什么这个冒泡排序有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56012004/

相关文章:

我们可以取消注册一个已经用 atexit() 注册的退出处理程序吗?

c++ - 带有修改(偏移)的冒泡排序

c++ - 如何突破 120 字节的限制?

c - 顺序访问内核驱动程序中的大页面

javascript - 仅从字符串中提取数字的函数

c - 如何在 C 语言中使用 for 循环的初始化变量作为占位符?

java - for循环Java返回值

javascript - React JS 排序和堆叠列表值

java - 这是正确的冒泡排序算法吗?

c - 在 C 中用字符串打印数组