该程序使用quicksort对数字进行排序,然后使用将负数和正数交替放置的代码。
#include<stdio.h>
#include<stdlib.h>
void swap(int *arr,int i,int j)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
int partition(int *arr,int left,int right)
{
int temp=0;
int i=left;
int j=right;
while(i<=j)
{
while(i<=right && arr[i]<=temp)
i++;
while(j>=left && arr[j]>=temp)
j--;
if(i<j)
swap(arr,i,j);
}
return j;
}
void quick_sort(int *arr,int left,int right)
{
if(left<right)
{
int pivot=partition(arr,left,right);
quick_sort(arr,left,pivot-1);
quick_sort(arr,pivot+1,right);
}
return ;
}
void nega(int *arr,int left,int right)
{
int i;
quick_sort(arr,left,right);
for(i=0;i<right+1;i++)
{
if(arr[i]>=0)
break;
}
int j=i;
int k;
for(i=1,k=j;i<j && k<=right;i+=2,k++)
{
int temp=arr[i];
arr[i]=arr[k];
arr[k]=temp;
}
}
int main()
{
int i,n;
int arr[15];
printf("enter the n:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("enter the element");
scanf("%d",&arr[i]);
}
printf("debug");
nega(arr,0,n-1);
for(i=0;i<n;i++)
printf("%d",arr[i]);
return 0;
}
在这里,代码要求用户输入n的值,并将n个元素放入数组中。如果n的值为1(即,对于一个元素),则工作正常。如果n的值> 1(对于1个以上的元素),则表明存在分段错误。可能在函数中某个位置无法访问。
但是,我不明白为什么printf("debug");
在输入代码后就不能立即执行它。它在执行之前直接显示分段错误,而在之前printf("debug");
没有发现任何分段错误的原因printf("debug");
。
有人可以指出我的问题吗,谢谢。
回答您的第一个问题:打印被缓冲。因此,如果程序崩溃,则尚未刷新缓冲区,并且不会打印“ debug”。尝试打印到stderr以用于记录和错误目的:
fprintf(stderr, "Debug");
我也会尝试回答您有关段错误的问题。
更新:
如果arr中的所有值都大于零,这将导致负枢轴:
while(j>=left && arr[j]>=temp)
j--;
如果您更改:
int temp = 0;
到:int temp = arr [left];
它不会给您带来细分错误,我想这就是您想要的。请注意,这不会修复您的排序算法,仅指定发生段错误的位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句