Why this quicksort code doesnot work... (c) -
#include <stdio.h> #include <stdlib.h> void quick(int *a,int left,int right,int k); void print(int *a); void swap(int *a,int x,int y); int indexpivot,n,tmp; int main() { int i,a[50],k; printf("\n\n\n size??\t\t"); scanf("%d",&n); for(i=0;i<n;i++){ printf(" %d. element...\t",i+1); scanf("%d",&a[i]); } printf("\n 1 or 2 ");//another method 1 important now,not 2 scanf("%d",&k); printf("\n first appearance "); print(a); quick(a,0,n-1,k); printf(" \nmedium element: %d\n ",a[(n)/2]); print(a); } //always putting first pivot void quick(int *a,int left,int right,int k){//k method,not used here int pivot,i,j; if(k==1){ indexpivot=left; pivot=a[indexpivot]; } /*else{ if(a[left]<a[right]){ if(a[(right+left)/2]>a[right]){ indexpivot=right; } else{ indexpivot=(right+left)/2; } } else{ if(a[(right+left)/2]>a[left]){ indexpivot=left; } else{ indexpivot=(right+left)/2; } } } printf("\n pivot: %d",a[indexpivot]);*/ while(indexpivot!=(right+left)/2&&left<right){ j=right; i=left+1;print(a); while(i<j){ while(pivot<a[j]&&left<j){ j=j-1; print(a); } while(pivot>a[i]&&i<j){ i=i+1; print(a); } if(i<j){ swap(a,i,j); print(a); i=i+1; j=j-1; print(a); } print(a); } //while(a[s]>pivot){i=i-1;} swap(a,indexpivot,j); indexpivot=j;//pivot goes place print(a); if(indexpivot>(right+left)/2){ quick(a,left,indexpivot-1,k); print(a); } if(indexpivot<(right+left)/2){ quick(a,indexpivot+1,right,k); print(a); } } } void print(int *a){ int i; printf("\n "); for(i=0;i<n;i++){ printf("%d ",a[i]); } } void swap(int *a,int x,int y){ int tmp; tmp=a[x]; a[x]=a[y]; a[y]=tmp; }
i working on 5 hours still couldnot ive. goes infinitive loop.
i give {1,2,3,4,5
goes infinite loop.
i debugged, analysed cannot see it.
waiting someone's suggestion.
this not quicksort. trying different. difference is
if(indexpivot>(right+left)/2){ quick(a,left,indexpivot-1,k); print(a); } if(indexpivot<(right+left)/2){ quick(a,indexpivot+1,right,k); print(a); }
that part.
the problem seems exist in line:
while(pivot<a[j]&&left<j)
which should be:
while(pivot<a[j]&&i<j)
Comments
Post a Comment