You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求排查快速排序代码中的段错误(SIGSEGV)问题

排查快速排序的段错误(SIGSEGV)问题

你的代码出现段错误的核心原因是递归调用时的区间范围错误,导致无限递归引发栈溢出,我来一步步拆解问题:

1. 递归调用的致命错误

看你的quick_sort函数里的递归部分:

quick_sort(arr,start,pindex);
quick_sort(arr,pindex,end);

partition函数执行完毕后,pindex位置的元素已经是最终排好序的基准值,不需要再参与后续的递归排序。但你第二个递归调用的起始参数是pindex,这会导致递归处理的区间始终包含这个基准值,形成无限递归——每次递归的区间都无法缩小到start >= end的终止条件,最终栈内存耗尽,触发SIGSEGV段错误。

正确的递归调用应该是:

quick_sort(arr, start, pindex);
quick_sort(arr, pindex + 1, end);

第二个递归从pindex + 1开始,跳过已经排好的基准值,保证每次递归的区间都在缩小。

2. 次要问题:拼写错误

你的partition函数里把pivot拼成了piviot,虽然这不会导致运行错误,但属于代码风格问题,建议修正以提升可读性。

修正后的完整代码

void swap(int* a,int* b) { 
    int temp=*a; 
    *a=*b; 
    *b=temp; 
}

int partition (int arr[],int start,int end) { 
    int pivot=arr[end-1];  // 修正拼写
    int pindex=start; 
    for(int i=start;i<end-1;i++) {
        if(arr[i]<=pivot) {
            swap(&arr[i],&arr[pindex++]);
        }
    }
    swap(&arr[end-1],&arr[pindex]); 
    return pindex; 
}

void quick_sort(int arr[],int start,int end) { 
    if(start<end) { 
        int pindex=partition(arr,start,end); 
        quick_sort(arr,start,pindex); 
        quick_sort(arr,pindex+1,end);  // 修正递归起始点
    } 
}

验证逻辑

修正后,每次递归的区间都会正确缩小:

  • 左递归处理[start, pindex)区间(你的quick_sort采用左闭右开的区间定义,end是区间的右边界,不包含在内)
  • 右递归处理[pindex+1, end)区间
    这样基准值所在的pindex位置不会被重复处理,递归会正常终止,不会出现栈溢出。

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

火山引擎 最新活动