首先把我根据百度百科里面的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;
}