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

问题描述 投票:0回答:1

我正在尝试使用递归来实现冒泡排序算法来对整数数组进行排序。但是,当我编译和运行代码时,我不断遇到分段错误。我尝试过调试但找不到问题。

#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;
    }



}
c loops recursion bubble-sort
1个回答
0
投票

如上面注释中所述,当第一个整数元素大于或等于第二个整数元素时,该函数似乎执行交换并随后递归调用排序函数。当元素相等时,执行交换和调用似乎是不必要的。当进行一些重构时,“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

测试一下。

© www.soinside.com 2019 - 2024. All rights reserved.