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

C语言递归排序函数问题求助:指针与递归传参错误排查

递归排序函数问题求助与代码错误分析

我是C语言新手,想实现一个接收int类型数组指针arr和int类型size的递归排序函数,要求从数组末尾到开头进行升序排序。但写的代码没法正常运行,对指针和数组的概念理解不足,完全找不到问题在哪。下面附上两段尝试的代码,恳请指出代码错误,以及需要学习和修正的内容。

尝试代码1

void    ft_recure(int *a, int *b, int j, int k)
{
    if (--j >= 0)
    {
        if (a[k] < b[j])
        {
            a[k] = b[j];
        }
        else
        {
            ft_recure(a[k], b[j], j, k);
        }
    }
    else
        return a[k];
}

void    ft_sort(int *tab, int size)
{
    int i;
    int h;
    while (size > 0)
    {
        i = size;
        h = i;
        tab[size] = ft_recure(tab, tab, i, h);
        size--;
    }
}

尝试代码2

int  ft_recurs(int x, int y, int a, int b)
{
    int j;
    
    j = a;
  if( a > 0)
  {
    
    if(*x < *(y - 1);)
    {
        b = *(y - 1);
      *x = b;
    }
    ft_recurs(*x,*(y - 1),a - 1, b);
  }
  else
  {
    return *x;
  }
}

void  ft_sort_int_tab(int *tab, int size)
{
  int memo;
  int i;

  while(--size >= 0)
  {
    i = size;
    tab[size] = ft_recurs(tab[i], tab[size], i, memo);
  }
}

代码错误分析

代码1的核心错误

  1. 返回值类型不匹配:ft_recure声明为void类型(无返回值),但else分支里写了return a[k];,这是语法错误,void函数不能返回任何值。
  2. 递归参数类型错误:ft_recure(a[k], b[j], j, k);中,a[k]和b[j]是int类型的元素值,但函数要求的是int*指针类型,类型不匹配会直接导致编译错误,强行运行会引发内存访问异常。
  3. 数组越界:tab[size] = ...中,数组的有效索引是从0到size-1,当size等于数组初始长度时,tab[size]已经超出数组范围,属于未定义行为。
  4. 逻辑完全混乱:递归函数没有实现“查找最大值并放到末尾”这类排序所需的核心逻辑,只是简单赋值,无法完成排序。

代码2的核心错误

  1. 解引用非指针变量:ft_recurs的参数x和y是int类型,却用*x、*(y-1)进行解引用操作——只有指针类型才能被解引用,这样写会把变量的值当作内存地址访问,直接导致程序崩溃。
  2. 语法错误:if(*x < *(y - 1);)里多了一个分号,破坏了if语句的语法结构,编译无法通过。
  3. 未初始化变量:ft_sort_int_tab中的memo未初始化就传递给ft_recurs,会使用内存中的垃圾值,导致逻辑错误。
  4. 数组越界:同样存在tab[size]访问超出有效索引的问题。
  5. 递归逻辑无效:递归调用传递的是元素值而非指针,且没有明确的排序逻辑,完全无法实现排序功能。

需要学习和修正的内容

  • 夯实指针与数组基础:明确数组名是指向首元素的指针,arr[i]等价于*(arr+i);严格区分int(值类型)和int*(指针类型)的使用场景,什么时候需要传递指针,什么时候传递值。
  • 掌握递归设计原则:递归必须有清晰的终止条件,每次递归调用必须向终止条件靠近;递归函数的功能要单一,比如先实现“递归查找最大值索引”这类小功能,再整合到排序逻辑中。
  • 从简单逻辑入手:先写迭代版的目标排序(比如选择排序:每次从0到当前末尾的范围找最大值,放到末尾,再缩小范围),再把其中的核心部分改成递归实现。
  • 重视编译器警告:编译时开启全量警告(比如GCC用-Wall -Wextra),编译器会直接提示类型不匹配、未初始化变量等基础错误,能帮你快速定位问题。

参考实现示例

以下是递归实现“从末尾到开头升序排序”的代码(基于选择排序逻辑):

// 递归查找0到end范围内最大值的索引
int find_max_index(int *arr, int end) {
    if (end == 0) {
        return 0;
    }
    int prev_max_idx = find_max_index(arr, end - 1);
    return arr[end] > arr[prev_max_idx] ? end : prev_max_idx;
}

// 递归排序函数:从末尾到开头升序排列
void recursive_sort(int *arr, int size) {
    if (size <= 1) {
        return; // 终止条件:数组长度<=1时无需排序
    }
    int max_idx = find_max_index(arr, size - 1);
    // 交换最大值到当前末尾位置
    int temp = arr[size - 1];
    arr[size - 1] = arr[max_idx];
    arr[max_idx] = temp;
    // 递归排序前size-1个元素
    recursive_sort(arr, size - 1);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:09:24