C中的冒泡排序:垃圾值错误
Bubble Sorting In C : garbage value error
所以最近我一直在学习 C 中的数据结构。现在让我们来谈谈我的问题
这是我的冒泡排序算法代码 :
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
void swap(int *p, int *q) {
int temp = *p;
*p = *q;
*q = temp;
}
int main() {
int arr[] = {2, 4, 1, 3, 5, 2, 3, 6, 4}; // see below for arr
int len = sizeof(arr) / sizeof(int);
for (int i = len - 1; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
if (arr[j] < arr[j + 1]) {
swap(&arr[j], &arr[j + 1]);
}
}
}
for (int m = 0; m < len; m++) {
printf("%d\t", arr[m]);
}
return 0;
}
当我的数组是这样的:int arr[]={2,4,1,3,5,2,6,10};
它排序完美但是当我将 arr
中的值的数量增加一个时,它开始给出垃圾值。
例如:int arr[]={2,4,1,3,5,2,6,10,13};
输出:int arr[]={2,4,1,3,5,2,6,10};
非常感谢详细的回答
当j=i
和i=len-1
(在j
的循环中允许)检查:
if(arr[j]<arr[j+1]){
swap(&arr[j],&arr[j+1]);
}
超出了 arr
的范围。此外,即使 i
的值较小,也不需要最后一次检查。要修复您的代码,请将循环条件设置为 j < i
而不是 j <= i
.
让你像这样循环,你永远不会有"off by one"错误:
for (int i = 0; i < len; i++) {
for (int j = i+1; j < len; j++) {
if (arr[j] < arr[i]) {
swap(&arr[i], &arr[j]);
}
}
}
所以最近我一直在学习 C 中的数据结构。现在让我们来谈谈我的问题
这是我的冒泡排序算法代码 :
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
void swap(int *p, int *q) {
int temp = *p;
*p = *q;
*q = temp;
}
int main() {
int arr[] = {2, 4, 1, 3, 5, 2, 3, 6, 4}; // see below for arr
int len = sizeof(arr) / sizeof(int);
for (int i = len - 1; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
if (arr[j] < arr[j + 1]) {
swap(&arr[j], &arr[j + 1]);
}
}
}
for (int m = 0; m < len; m++) {
printf("%d\t", arr[m]);
}
return 0;
}
当我的数组是这样的:int arr[]={2,4,1,3,5,2,6,10};
它排序完美但是当我将 arr
中的值的数量增加一个时,它开始给出垃圾值。
例如:int arr[]={2,4,1,3,5,2,6,10,13};
输出:int arr[]={2,4,1,3,5,2,6,10};
非常感谢详细的回答
当j=i
和i=len-1
(在j
的循环中允许)检查:
if(arr[j]<arr[j+1]){
swap(&arr[j],&arr[j+1]);
}
超出了 arr
的范围。此外,即使 i
的值较小,也不需要最后一次检查。要修复您的代码,请将循环条件设置为 j < i
而不是 j <= i
.
让你像这样循环,你永远不会有"off by one"错误:
for (int i = 0; i < len; i++) {
for (int j = i+1; j < len; j++) {
if (arr[j] < arr[i]) {
swap(&arr[i], &arr[j]);
}
}
}