嗨,我正在使用gdb调试我的冒泡排序代码,但我不明白为什么它会在if(a[j] < a[j-1]
处不断崩溃
这是我的气泡排序功能
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 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;
}
}
答案 0 :(得分:2)
在外循环的第一次迭代中(i
的值为0时),内循环成为无限循环,因为j
的值从0开始并不断增加。最终j
的大小足以使您的程序访问一些未分配的内存,从而导致分段错误。
此外,在内部循环的第一次迭代中,j
的值为0,因此a[j - 1]
将尝试访问程序之外的内存位置。
答案 1 :(得分:1)
j > i
在第一次迭代中为false,因此if(nswaps == 0)
为true并且循环中断,不进行排序。
与其重复n
次外循环,不如重复n-1
次。
无需计算掉期,一个布尔值就足够了。
在第一次内循环迭代之后,找到了数组的最低元素,并在末尾放置了该元素。下一个内部循环只需要迭代到倒数第二个元素,等等。
size_t
是用于数组索引的Goldilocks类型,既不能太窄也不能太宽。比使用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--;
}
}