不确定Bubble排序代码为何存在分段错误

时间:2018-09-26 23:27:40

标签: c

嗨,我正在使用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;
 }

}

2 个答案:

答案 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--;
  }
}