2013-11-09 185 views
1

该程序使用快速排序对数字进行排序,然后将代码放入负号和正数中。尝试运行程序时出现分段错误

#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");右后输入到code.It直接表示执行printf("debug");前分段错误和printf("debug");之前我没有找到分段故障的任何原因。

有人能指出我有什么问题。谢谢。

+1

将“printf(”你输入的%d(%i的%i)“,arr [i],i,n)'放在scanf() –

回答

0

要回答你的第一个问题:打印是缓冲的。所以如果你编程崩溃,缓冲区没有被刷新,并且“debug”不被打印。尝试打印到标准错误记录和错误目的:

fprintf(stderr, "Debug"); 

我会尽力回答你关于段错误的问题。

更新:

这将导致一个负主如果ARR所有值大于零:

while(j>=left && arr[j]>=temp) 
    j--; 

如果更改:

int temp = 0; 

到: INT温度= ARR [左];

它不会给你一个分段错误,我认为这是你想要的。请注意,这不会解决您的排序算法,只能指定您的段错误发生的位置。

1
for(i=0;i<right+1;i++) 
{ 
    if(arr[i]>=0) 
    break; 
} 

这部分看起来很腥。能永远是最后的元素吗?

相关问题