为什么气泡排序错误?

时间:2019-05-06 20:28:36

标签: 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);
    }
}

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

第二个打印功能表明i和arr都等于“ -13312”,而arr + n等于“ -13284”。

我的打印功能(此处未列出)仅连续打印七个34s。

1 个答案:

答案 0 :(得分:2)

代码以多种方式破坏:

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