You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归实现冒泡排序时出现Segmentation Error问题求助

递归冒泡排序段错误问题分析与修复

问题根源

你的代码出现段错误是因为无限递归导致栈溢出,具体原因有两点:

  1. 循环范围错误:for (int i = 0; i < ARR_SIZE - 2; i++) 中,ARR_SIZE - 2 让循环只处理到索引7(i最大为7),索引9的元素从未参与比较,导致部分元素始终无法归位,swap_counter 一直不为0,递归永远无法终止。
  2. 递归未缩小排序范围:每次递归都从头处理整个数组,没有把已经排好的末尾元素排除在外,进一步加剧了无限递归的问题。

修复后的代码

#include <stdio.h>

#define ARR_SIZE 10

// 修改函数参数,增加当前需要排序的长度
void bubble_sort(int array[], int length);

int main(void)
{
    int array[] = {4,2,9,3,2,4,9,10,20,4};

    // 初始传入数组总长度
    bubble_sort(array, ARR_SIZE);

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

void bubble_sort(int array[], int length)
{
    if (length <= 1) {
        // 只剩一个元素,无需排序,直接返回
        return;
    }

    int swap_counter = 0;
    // 循环范围改为 length - 1,确保能比较到当前未排序部分的最后一对元素
    for (int i = 0; i < length - 1; 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)
    {
        // 递归处理前 length-1 个元素(最后一个已排好)
        bubble_sort(array, length - 1);
    }
}

关键修改点

  • 给bubble_sort增加length参数,用于指定当前需要排序的数组长度,每次递归时长度减1,排除已经排好的末尾元素。
  • 循环条件改为i < length - 1,确保能遍历到当前未排序部分的所有相邻元素对。
  • 增加递归终止条件:当length <= 1时直接返回,避免不必要的递归。
  • 把array[i] >= array[i + 1]改为array[i] > array[i + 1],避免相等元素无意义的交换,提升效率。

内容的提问来源于stack exchange,提问作者Phoenix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:42:22