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;
    }
    
    
    
     
  • 相关阅读:
    java 日志框架的选择Log4j->SLF4j->Logback
    linux上的常用命令
    Zookeeper配置Kafka
    分布式日志收集框架Flume
    Spark Streaming简介
    Spring Cloud学习笔记之微服务架构
    IntelliJ IDEA学习记录
    firefox插件-自动化测试工具-selenium IDE
    大数据01
    使用java开发spark的wordcount程序(多种实现)
  • 原文地址:https://www.cnblogs.com/freewater/p/2622096.html
Copyright © 2011-2022 走看看