C 不确定为什么气泡排序代码有分段错误

C 不确定为什么气泡排序代码有分段错误,c,C,嗨,我正在使用gdb调试我的冒泡排序代码,但我不明白为什么它在if(a[j]

嗨,我正在使用gdb调试我的冒泡排序代码,但我不明白为什么它在
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故障?