首先把我根据百度百科里面的C语言版快速排序的理解写出来:
void qsort2(int *l,int left,int right){ if(left>=right) return; int i=left,j=right,t; t=l[left]; while(i<j){ for(;l[j]>=t && i<j;j--) ; l[i]=l[j]; for(;l[i]<=t && i<j;i++) ; l[j]=l[i]; } l[i]=t; qsort2(l,left,i-1); qsort2(l,i+1,right); }
这个里面我在理解的时候发现在两个for循环中间如果i==j了,那么还是会有个赋值操作,所以我加了一个判断如下:
void qsort2(int *l,int left,int right){ if(left>=right) return; int i=left,j=right,t; t=l[left]; while(i<j){ for(;l[j]>=t && i<j;j--) ; if(i==j) break; l[i]=l[j]; for(;l[i]<=t && i<j;i++) ; l[j]=l[i]; } l[i]=t; qsort2(l,left,i-1); qsort2(l,i+1,right); }
这样就不会在i==j的时候在做赋值操作了。
下面是C语言程序设计中第四章的快速排序:
void qsort(int *l,int left,int right){ int i,last; void swap(int *v,int i,int j); if(left>=right) return; swap(l,left,(left+right)/2); last=left; for(i=left+1;i<=right;i++) if(l[left]>l[i]){ swap(l,++last,i); } swap(l,left,last); qsort(l,left,last-1); qsort(l,last+1,right); } void swap(int *l,int i,int j){ int temp; temp=l[i]; l[i]=l[j]; l[j]=temp; }
这个我理解了好久,后来发现这个程序在last+1=i的时候还有swap(l,++last,i)这个操作,我添加了一段代码:
void qsort(int *l,int left,int right){ int i,last; void swap(int *v,int i,int j); if(left>=right) return; swap(l,left,(left+right)/2); last=left; for(i=left+1;i<=right;i++) if(l[left]>l[i]){ if(last+1==i){ last++; continue; } swap(l,++last,i); } swap(l,left,last); qsort(l,left,last-1); qsort(l,last+1,right); }
这样修改完成后,经过我的测试时没有问题的,上面写的都是比较简单的快速排序,第二个算法要比第一个好些(从某种程度来讲),实际的快速排序涉及到了很多算法与数据结构的知识,我还在学习。等学有所成之后会在回来分析这个问题。
最后把我用来检验排序的main函数也贴出来吧:
int main(int argc, char const *argv[]) { /* code */ int v[]={1,2,4,1,2,8,5},n=7,i; for(i=0;i<n;i++) printf("%d ",v[i] ); printf("\n"); qsort(v,0,n-1); for(i=0;i<n;i++) printf("%d ",v[i]); return 0; }