我尝试实现Selection sort的递归形式。但错误为"分段错误"正在展示。错误在哪里?递归算法通常会遇到哪些错误?
#include <stdio.h>
void ssort(int[],int,int);
void prints(int[],int);
void sorting(int[],int,int);
int a[]= {5,6,3,1,2,4};
int main()
{
ssort(a,0,6);
prints(a,6);
return 0;
}
void ssort(int a[],int s,int e)
{
int min=a[s];
int ch,p,j;
for(j=s+1; j<e; j++)
{
if(min>a[j])
{
min=a[j];
ch=j;
}
}
sorting(a,j,ch);
if(s+1<e)
{
ssort(a,s+1,e);
}
}
void prints(int a[],int n)
{
int i;
for(i=0; i<n; i++)
printf("%d",a[i]);
}
void sorting(int a[],int j,int ch)
{
int p=a[j];
a[j]=a[ch];
a[ch]=p;
}
答案 0 :(得分:1)
访问非法内存时会引发分段错误。有可能排序(a,j,ch);&#34;即使代码可能没有通过预先存在的for循环中的if块,也可能被调用。在那种情况下,&#34; ch&#34;可能是不可预测的,然后当你访问排序(..)函数内的[ch]时,它可能会访问一些非法的内存,这将导致分段错误
答案 1 :(得分:1)
BLUEPIXY在这个问题上的评论几乎解决了这个问题。写这个来添加为什么需要这些更改。
问题1:在递归的每个步骤中,您将最小值存储在第一个索引中(针对该递归级别)。要首先执行此操作,请确定最小值的索引,您在代码中使用ch
进行扫描。然后,您将第一个索引中的值与具有最小值的索引进行交换。这意味着您的代码应该交换索引s
和ch
中的值。但是,您正在交换最后索引中的值和具有最小值的索引。所以你需要进行以下更改:
/* sorting(a,j,ch); */ // ISSUE: you are swapping with last index
sorting(a, s, ch); // CORRECT: you are swapping with first index
问题2:如果条件if(min>a[j])
永远不为真,则永远不会执行ch = j;
,ch
将具有不确定的值。然后,当您致电sorting(a, s, ch);
时,您的程序将无法获得确定性结果,甚至可能会崩溃。因此,您必须将s
设置为beggning的最小索引,如下:
/* int ch,p,j; */
int ch = s, p,j; // Initialize ch with starting index
这些更改可以解决您的问题。但是,您可以进行的一项更改是,仅在需要时交换值:
/*sorting(a,j,ch);*/
if (ch != s)
sorting(a, s, ch);
最后,您可能希望将函数sorting
的名称更改为swap
。