2013-11-09 8 views
1

이 프로그램은 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 개 요소 이상)의 값. 세분화 오류가 표시 될 수 있습니다. 함수 어딘가에 있으면 액세스 할 수없는 위치에 액세스 할 수 있습니다.

단, code.It에 입력이 직접 printf("debug");을 실행하기 전에 세그먼트 오류를 ​​보여주는 직후가 printf("debug");을 실행되지 않는 이유 이해가 안 나는 printf("debug"); 전에 세그먼트 오류에 대한 원인을 찾을 수 없습니다.

누군가가 문제를 지적 할 수 있습니까? 감사합니다.

+1

디버깅 할 목적으로 'printf ("% d (% i of % i)", arr [i], i, n)'를 scanf –

답변

0

첫 번째 질문에 대답하려면 : 인쇄물이 버퍼링됩니다. 따라서 프로그램을 중단하면 버퍼가 플러시되지 않고 "디버그"가 인쇄되지 않습니다. 로깅 및 오류 목적으로 stderr에 인쇄 해보십시오 :

fprintf(stderr, "Debug"); 

segfault에 대한 귀하의 질문에도 답변 해 드리겠습니다.

업데이트 :

편곡 모든 값이 제로 위에있는 경우는 음의 선회가 발생합니다

:

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

변경할 경우

int temp = 0; 

에 : INT 온도 = arr [left];

세분화 오류가 발생하지 않으며 원하는 내용이라고 생각합니다. 이 방법은 정렬 알고리즘을 수정하지 않으며 segfault가 발생하는 위치 만 지정합니다.

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

이 부분은 물고기처럼 보입니다. 이제까지 마지막 요소가 될 수 있습니까?

관련 문제