c - Accessing and storing elements in an array -
i have modified version of quicksort in program instructed sort pairs of numbers sum of squares ( example: -4,1 > 2,2). program works fine positive integers, when use many negative integers program crashes (any more 1 or 2 negative numbers cause crash). think i'm trying access or sort undefined parts of array storing integers. array storage forgetting? or problem elsewhere?
void swap(int *a,int *b); int square(int num); int abs_value(int num); void quicksort(int arr[],int first,int last); int main() { int num_of_pts; int num1; int num2; printf("enter number of points: ");//points coordinates on xy axis scanf("%d", &num_of_pts); //that's why there double int unsorted_pts_arr[2*num_of_pts];//the amount of storage in array for(int i=0; i<num_of_pts; i++){ printf("enter point: "); scanf(" %d",&num1); scanf(" %d",&num2); unsorted_pts_arr[2*i]=num1; unsorted_pts_arr[2*i+1]=num2; } quicksort(unsorted_pts_arr,0,num_of_pts); printf("sorted points:"); for(int j=0; j<num_of_pts; j++) printf(" (%d,%d)",unsorted_pts_arr[2*j],unsorted_pts_arr[2*j+1]); return 0; } void swap(int *a,int *b) { int temp; temp = *b; *b = *a; *a = temp; } int square(int num) { num=abs_value(num); num*=num; return num; } int abs_value(int num) { if(num<0) return -num; else return num; } void quicksort(int arr[],int first,int last) { int pivot,j,i; if(first<last){ pivot=first; i=first; j=last; while(i<j){ while((square(arr[2*i])+square(arr[2*i+1]))<= (square(arr[pivot])+square(arr[pivot+1])) &&i<last) i++; while((square(arr[2*j])+square(arr[2*j+1]))> (square(arr[pivot])+square(arr[pivot+1]))) j--; if(i<j){ swap(&arr[2*i],&arr[2*j]); swap(&arr[2*i+1],&arr[2*j+1]); } } swap(&arr[pivot],&arr[2*j]); swap(&arr[pivot+1],&arr[2*j+1]); quicksort(arr,first,2*j-1); quicksort(arr,2*j+1,last); } }
main problem
you accessing array out of bounds using 2*j-1 , 2*j+1 array indices in recursive calls.
quicksort(arr,first,2*j-1); quicksort(arr,2*j+1,last); when call quicksort main, last equal num_of_pts. makes sense in recursive calls, should use j , j+1.
quicksort(arr,first,j); quicksort(arr,j+1,last); suggestion minor improvement
implementation of square can simpler.
int square(int num) { return num*num; }
Comments
Post a Comment