2013-11-09 151 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; 
} 

這部分看起來很腥。能永遠是最後的元素嗎?

相關問題