为什么我的排序函数输出垃圾值?
Why does my sorting function output garbage values?
- 我正在处理冒泡排序,但长度完全偏离,开始打印垃圾值,如 0,1,2
- 我已经尝试在我的 for 循环中操纵我的条件,但它仍然输出垃圾值
void bubbleSort(int array[], int len){
int temp;
int counter = -1;
printf("\n");
while(counter != 0){
counter = 0;
for (int i = 0; i < len; i++) {
//compare two ints swich the greater value to the right
if (array[i] > array[i + 1]){
temp = array[i + 1];
array[i + 1] = array[i];
array[i] = temp;
counter++;
//increment counter
}
}
}
for (int i = 0; i <= len; i++) {
printf("%i ", array[i]);
}
printf("\nBubble Sort Completed\n");
}
int main(void){
int a[] = {1, 2, 4, 5, 7 ,6, 8, 3, 9};
int b[] = {10, 20, 40, 54, 23, 23, 12};
size_t a_length = sizeof(sizeof(a)/sizeof(a[0]));
size_t b_length = sizeof(sizeof(b)/sizeof(b[0]));
bubbleSort(a, a_length);
bubbleSort(b, b_length);
}
我的输出通常是这样的
1 2 3 4 5 6 7 8 9
冒泡排序已完成
0 1 10 12 20 23 23 40 54
冒泡排序已完成
- 还有一点好奇,为什么数组b的长度等于8?该值不应该是 7 吗?
至少这些问题:
比较最终访问数组边界外 array[i + 1]
导致 未定义的行为 (UB)。 UB什么事都可能发生。
// Alternative code
// for (int i = 0; i < len; i++) {
for (int i = 1; i < len; i++) {
// if (array[i] > array[i + 1]){
if (array[i-1] > array[i]){
temp = array[i];
array[i] = array[i-1];
array[i-1] = temp;
counter++;
}
}
...和...
// for (int i = 0; i <= len; i++) {
for (int i = 0; i < len; i++) {
printf("%i ", array[i]);
}
...和...
尺寸计算错误。
//size_t a_length = sizeof(sizeof(a)/sizeof(a[0]));
//size_t b_length = sizeof(sizeof(b)/sizeof(b[0]));
size_t a_length = sizeof a / sizeof a[0];
size_t b_length = sizeof b / sizeof b[0];
也考虑在数组索引中使用相同的类型
// void bubbleSort(int array[], int len){
void bubbleSort(int array[], size_t len){
size_t temp, counter;
...
- 我正在处理冒泡排序,但长度完全偏离,开始打印垃圾值,如 0,1,2
- 我已经尝试在我的 for 循环中操纵我的条件,但它仍然输出垃圾值
void bubbleSort(int array[], int len){
int temp;
int counter = -1;
printf("\n");
while(counter != 0){
counter = 0;
for (int i = 0; i < len; i++) {
//compare two ints swich the greater value to the right
if (array[i] > array[i + 1]){
temp = array[i + 1];
array[i + 1] = array[i];
array[i] = temp;
counter++;
//increment counter
}
}
}
for (int i = 0; i <= len; i++) {
printf("%i ", array[i]);
}
printf("\nBubble Sort Completed\n");
}
int main(void){
int a[] = {1, 2, 4, 5, 7 ,6, 8, 3, 9};
int b[] = {10, 20, 40, 54, 23, 23, 12};
size_t a_length = sizeof(sizeof(a)/sizeof(a[0]));
size_t b_length = sizeof(sizeof(b)/sizeof(b[0]));
bubbleSort(a, a_length);
bubbleSort(b, b_length);
}
我的输出通常是这样的
1 2 3 4 5 6 7 8 9 冒泡排序已完成
0 1 10 12 20 23 23 40 54 冒泡排序已完成
- 还有一点好奇,为什么数组b的长度等于8?该值不应该是 7 吗?
至少这些问题:
比较最终访问数组边界外 array[i + 1]
导致 未定义的行为 (UB)。 UB什么事都可能发生。
// Alternative code
// for (int i = 0; i < len; i++) {
for (int i = 1; i < len; i++) {
// if (array[i] > array[i + 1]){
if (array[i-1] > array[i]){
temp = array[i];
array[i] = array[i-1];
array[i-1] = temp;
counter++;
}
}
...和...
// for (int i = 0; i <= len; i++) {
for (int i = 0; i < len; i++) {
printf("%i ", array[i]);
}
...和...
尺寸计算错误。
//size_t a_length = sizeof(sizeof(a)/sizeof(a[0]));
//size_t b_length = sizeof(sizeof(b)/sizeof(b[0]));
size_t a_length = sizeof a / sizeof a[0];
size_t b_length = sizeof b / sizeof b[0];
也考虑在数组索引中使用相同的类型
// void bubbleSort(int array[], int len){
void bubbleSort(int array[], size_t len){
size_t temp, counter;
...