C 不确定为什么气泡排序代码有分段错误
嗨,我正在使用gdb调试我的冒泡排序代码,但我不明白为什么它在C 不确定为什么气泡排序代码有分段错误,c,C,嗨,我正在使用gdb调试我的冒泡排序代码,但我不明白为什么它在if(a[j]
if(a[j]
这是我的冒泡排序函数
void sort(int a[], int n) {
int i, j, nswaps, tmp;
for(i = 0; i < n; i++) {
nswaps = 0;
for(j = 0; j > i; j++) {
if(a[j] < a[j-1]) {
tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
nswaps++;
}
}
if(nswaps == 0) break;
}
}
void排序(int a[],int n){
int i、j、nswaps、tmp;
对于(i=0;ii;j++){
if(a[j]
请帮帮我,谢谢
更新代码:仍然存在分段错误
void sort(int a[], int n) {
int i, j, nswaps;
for (i = 0; i < n; i++) {
nswaps = 0;
for (j = 1; j > i; j++) {
if (a[j] < a[j-1]) {
int tmp;
tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
nswaps++;
}
}
if (nswaps == 0) break;
}
void排序(int a[],int n){
int i,j,nswaps;
对于(i=0;ii;j++){
if(a[j]
}在外循环的第一次迭代中(当
i
的值为0时),内循环变成一个无限循环,因为j
的值从0开始并不断增加。最终j
变得足够大,您的程序可以访问一些未分配的内存,从而导致分段错误
此外,在内部循环的第一次迭代中,
j
的值为0,因此a[j-1]
将尝试访问程序的内存位置超出限制。在外部循环的第一次迭代中(当i
的值为0时),内部循环变为无限循环,因为j
的值从0开始并不断增加。最终j
变得足够大,您的程序可以访问一些未分配的内存,从而导致分段错误
此外,在内部循环的第一次迭代中,
j
的值为0,因此a[j-1]
将尝试访问程序的内存位置。在第一次迭代中,j
i为false,因此如果(nswaps==0)为true且循环中断,则不会进行排序
不要迭代外部循环
n
次,而是迭代n-1次
不需要计算交换,一个简单的布尔值就足够了
在第一次内循环迭代之后,找到数组中最低的元素并在末尾就位。下一个内循环只需要迭代到下一个最后一个元素,依此类推
size\u t
是用于数组索引的goldilock类型,既不太窄也不太宽。比使用int
进行索引更好。请记住,这是一种无符号类型
在需要之前不需要声明变量
#include <stdbool.h>
#include <stdlib.h>
void bubble_sort(int a[], size_t n) {
while (n > 1) {
bool swapped = false;
for (size_t j = 1; j < n; j++) {
if (a[j-1] < a[j]) {
int tmp = a[j];
a[j] = a[j - 1];
a[j - 1] = tmp;
swapped = true;
}
}
if (!swapped) {
break;
}
n--;
}
}
#包括
#包括
无效气泡排序(整数a[],大小n){
而(n>1){
布尔交换=假;
对于(尺寸j=1;j
j>i
在第一次迭代时为false,因此如果(nswaps==0)
为true且循环中断,则不会进行排序
不要迭代外部循环n
次,而是迭代n-1次
不需要计算交换,一个简单的布尔值就足够了
在第一次内循环迭代之后,找到数组中最低的元素并在末尾就位。下一个内循环只需要迭代到下一个最后一个元素,依此类推
size\u t
是用于数组索引的goldilock类型,既不太窄也不太宽。比使用int
进行索引更好。请记住,这是一种无符号类型
在需要之前不需要声明变量
#include <stdbool.h>
#include <stdlib.h>
void bubble_sort(int a[], size_t n) {
while (n > 1) {
bool swapped = false;
for (size_t j = 1; j < n; j++) {
if (a[j-1] < a[j]) {
int tmp = a[j];
a[j] = a[j - 1];
a[j - 1] = tmp;
swapped = true;
}
}
if (!swapped) {
break;
}
n--;
}
}
#包括
#包括
无效气泡排序(整数a[],大小n){
而(n>1){
布尔交换=假;
对于(尺寸j=1;j
因为当j
为零时,a[j-1]
是未定义的。你应该从j
开始在1处(而不是零)。哦,谢谢!!我会试试的out@ElliottFrisch但是我仍然有seg故障?发布新代码您发布的代码有for(j=n-1
,回答说使用for(j=1
,因为a[j-1]当j
为零时,
是未定义的。你应该从j
开始,在1处(而不是零)。哦,谢谢!!我会试试的out@ElliottFrisch但是我仍然有seg故障?发布新代码您发布的代码有用于(j=n-1
,回答说使用用于(j=1
谢谢!我试过了j=1它还是会给我一个seg故障?谢谢!我试过了j=1它还是会给我一个seg故障?