快速排序

/*qsort1至qsort3都是同一种思路,只是变换了不变式invariant罢了*/
/*分割点a[u].
invariant:a[l,m)<t && a[m,i)>=t, for each i in [l,u)*/
void
qsort1(int a[],int l,int u){ if(l>=u) return; int m=l; for(int i=l;i<u;i++){ if(a[i]<a[u]){ //a[i]<->a[m]; swap(a[i],a[m]); m++; } } swap(a[m],a[u]); qsort1(a,l,m-1); qsort1(a,m+1,u); }

/*分割点a[l].
invariant:a[l+1,m]<t && a(m,i)>=t, for each i in [l+1,u]*/

void qsort2(int a[],int l,int u){

if(l>=u)
        return;
    int m=l;
    for(int i=l+1;i<=u;i++){
        if(a[i]<a[l]){
            m++;
            //a[i]<->a[m];
            swap(a[i],a[m]);    
        }
    }
    swap(a[m],a[l]);

    qsort1(a,l,m-1);
    qsort1(a,m+1,u);
}

/*分割点a[l].
invariant:a[l+1,m)<t && a[m,i)>=t, for each i in [l+1,u]*/

void qsort3(int a[],int l,int u){
    if(l>=u)
        return;
    int m=l+1;
    for(int i=l+1;i<=u;i++){
        if(a[i]<a[l]){
            
            //a[i]<->a[m];
            swap(a[i],a[m]);
            m++;    
        }
    }
    m--;
    swap(a[m],a[l]);

    qsort1(a,l,m-1);
    qsort1(a,m+1,u);
}

/*解决待排序数组中元素相同导致性能退化,方法是两端遍历,交换前面大于等于t的元素与后面的小于等于t的元素。*/
void qsort4(int a[],int l,int u){ if(l>=u) return; int t=a[l]; int i=l,j=u+1; while(true){ do{ i++; }while(i<=u&&a[i]<t); do{ j--; }while(a[j]>t); if(i>j) break; swap(a[i],a[j]); } swap(a[l],a[j]); qsort4(a,l,j-1); qsort4(a,j+1,u); }
//快速排序非递归实现,网易游戏2013笔试题
//方法一
void qs1(int a[],int begin,int end){
    if(begin>=end)
        return;

    stack<int> s;
    s.push(begin);
    s.push(end);

    while(!s.empty()){
        end=s.top();
        s.pop();
        begin=s.top();
        s.pop();
        int pivot=partition(a,begin,end);
        if(pivot-1>begin){
            s.push(begin);
            s.push(pivot-1);
        }
        if(end>pivot+1){
            s.push(pivot+1);
            s.push(end);
        }
    }
}

//方法二
void qs2(int a[],int begin,int end){
    if(begin>=end)
        return;

    stack<int> s;
    while(begin<end||!s.empty()){            
        if(begin<end){
            int pivot=partition(a,begin,end);
            if(pivot+1<end){
                s.push(pivot+1);
                s.push(end);
            }
            end=pivot-1;
        }
        else{
            end=s.top();
            s.pop();
            begin=s.top();
            s.pop();
        }
    }
}

//partition很简单
int partition(int a[],int l,int u){
    int m=l;
    for(int i=l;i<u;i++){
        if(a[i]<a[u]){
            //a[i]<->a[m];
            swap(a[i],a[m]);
            m++;
        }
    }
    swap(a[m],a[u]);
    return m;
}


 
原文地址:https://www.cnblogs.com/freewater/p/2622096.html