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