为什么这个冒泡排序有问题?
Why Is This Bubble Sort Faulty?
我已经尝试了几次,但我无法让我的 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 < (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 循环进行不止一次迭代。该项目要求我使用指针变量作为冒泡排序程序的参数。我没有包括整个代码(即我省略了输入数组和打印操作,因为问题存在于冒泡排序代码本身)。
我已经尝试了同一代码的不同版本,并在我的代码的不同区域输入了打印选项。这让我意识到我的指针变量 "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 < (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;
}
}
}
}