zoukankan      html  css  js  c++  java
  • 快速排序

    /*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;
    }
    
    
    
     
  • 相关阅读:
    e621. Activating a Keystroke When Any Child Component Has Focus
    e587. Filling Basic Shapes
    e591. Drawing Simple Text
    e595. Drawing an Image
    e586. Drawing Simple Shapes
    e636. Listening to All Key Events Before Delivery to Focused Component
    在 PL/SQL 块的哪部分可以对初始变量赋予新值? (选择1项)
    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
    你判断下面语句,有什么作用?(单选)
    Oracle数据库表空间与数据文件的关系描述正确的是( )
  • 原文地址:https://www.cnblogs.com/freewater/p/2622096.html
Copyright © 2011-2022 走看看