在C中运行递归冒泡排序时的分段错误

vbkedwbf  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(114)

我试图实现冒泡排序算法使用递归排序的整数数组。但是,在编译和运行代码时,我总是遇到分段错误。我试过调试它,但我找不到问题。

#include <stdio.h>

#define ARR_SIZE 10

//primitive function
void bubble_sort(int array[]);

//sort the number array using bubble sort
int main(void)
{
    int array[] = {4,2,9,3,2,4,9,10,20,4};

    bubble_sort(array);

    for (int i = 0; i < ARR_SIZE ; i++)
    {
        printf("%i\n", array[i]);
    }
}

void bubble_sort(int array[])
{
    int swap_counter = 0;
    for (int i = 0; i < ARR_SIZE - 2; i++)
    {
        if (array[i] >= array[i + 1])
        {
            swap_counter++;
            int temp = array[i];
            array[i] = array[i + 1];
            array[i + 1] = temp;
        }

    }

    if (swap_counter != 0)
    {
        bubble_sort(array);
    }
    else
    {
        return;
    }


}
ffscu2ro

ffscu2ro1#

正如上面的注解中所指出的,当第一个整数元素大于或等于第二个整数元素时,该函数似乎执行交换并随后递归调用排序函数。当元素相等时,似乎不需要执行交换和调用。在进行重构时,“for”循环并没有测试出整数数组中的最后一个元素。
下面是我重构的两个代码片段,它们似乎使用递归调用来执行冒泡排序功能,而不是重新发布一个完全重构的程序。
代替以下声明:

for (int i = 0; i < ARR_SIZE - 2; i++)

使用以下尺寸测试:

for (int i = 0; i < ARR_SIZE - 1; i++)

而且,当两个数组元素相等时,不执行交换:

if (array[i] >= array[i + 1])

只有当第一个元素实际上大于第二个元素时,才执行交换和递归调用:

if (array[i] > array[i + 1])

当我用这些重构位测试你的代码时,下面是没有溢出问题的终端输出。

craig@Vera:~/C_Programs/Console/BubbleSort/bin/Release$ ./BubbleSort 
2
2
3
4
4
4
9
9
10
20

给予一个测试。

相关问题