• 快速排序


    /*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;
    }
    
    
    
     
  • 相关阅读:
    门户网站架构Nginx+Apache+MySQL+PHP+Memcached+Squid
    车牌识别及验证码识别的一般思路
    PHP for Linux之xml2config这个文件没找到
    使用nginx配置多个php fastcgi负载均衡
    centos支持中文,中文输入法
    centos 配置 ssh
    千万级数据?教你合理设计数据表,将优化进行到底
    linux mysql proxy 的安装,配置,以及读写分离
    网站压力测试工具 webbench
    php5.3中webservice利用soap—WSDL文件解析WSDL : 描述你的Web服务(转载)
  • 原文地址:https://www.cnblogs.com/freewater/p/2622096.html
Copyright © 2020-2023  润新知