C中数组排序算法中的Segfault错误

时间:2016-07-23 18:43:59

标签: c arrays

我是编程的初学者,我正在通过K.N.King" C编程:现代方法"工作。现在我正在尝试编写第9章的编程项目1,但我一直遇到段错误,我不确定代码有什么问题。任何更正都表示赞赏!

这些是说明:

编写一个程序,要求用户输入一系列整数(它存储在数组中),然后通过调用函数selection_sort对整数进行排序。当给定具有n个元素的数组时,selection_sort必须执行以下操作:
1.搜索数组以找到最大元素,然后将其移动到数组中的最后位置 2.递归调用自身对数组的前n - 1个元素进行排序。

这是我的代码:

#include <stdio.h>

void selection_sort(int n, int a[n]);

int main(void)
{
    int n;

    printf("Number of integers to sort: ");
    scanf("%d", &n);

    int a[n];

    printf("Enter the integers: ");
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    selection_sort(n, a);

    printf("Sorted array: ");
    for (int i = 0; i < n; i++)
        printf("%d", a[i]);

    return 0;
}

void selection_sort(int n, int a[n])
{
    int swap, max = a[n - 1];

    for (int i = 0; i < n; i++) {
        if (a[i] > max) {
            max = a[i];
            swap = a[n - 1];
            a[n - 1] = max;
            a[i] = swap;
        }
    }
    if (n > 1)
        selection_sort(n - 1, a);
}

编辑:将(n> 1)更改为if(n> 1),现在它完美运行。但是为什么它不适合呢?

2 个答案:

答案 0 :(得分:3)

您需要一个不调用selection_sort的条件。就像现在一样,您的selection_sort 总是调用selection_sort,这会导致无限循环。

而且,由于您在每一步都递减n,因此它会变为负数,并且您开始访问a[-1],这是错误的。

答案 1 :(得分:2)

你需要有一些递归的基本条件,以避免无休止地调用相同的函数。你可以做类似的事情

void selection_sort(int n, int a[])
{
    if(n<=0)return;  //base condition
    int swap, max = a[n - 1];