• C++快速排序例子(递归和非递归)


    /*
     * description:        快速排序示例
     * writeby:            nick
     * date:            2012-10-23 16:16
     *
     */
    
    #include <iostream>
    #include <stack>
    
    using namespace std;
    
    //递归版本
    void quicksort(int a[], int l, int r)
    {
        int mid = a[(l+r) / 2];
        int lwalker = l, rwalker = r;
        while(lwalker < rwalker)
        {
            while(a[lwalker] < mid) lwalker++;
            while(a[rwalker] > mid) rwalker--;
            if(lwalker <= rwalker)
            {
                int tmp = a[lwalker];
                a[lwalker] = a[rwalker];
                a[rwalker] = tmp;
                lwalker++;
                rwalker--;
            }
        }
        if(lwalker < r) quicksort(a, lwalker, r);
        if(rwalker > l) quicksort(a, l, rwalker);
    }
    
    inline void push2(stack<int> &s, int l, int r)
    {
        s.push(r);
        s.push(l);
    }
    
    //非递归,使用栈
    void qsort(int a[], int l, int r)
    {
        stack<int> s;
        push2(s, l, r);
        int lwalker,  rwalker, mid;
        while(!s.empty())
        {
            int left = s.top(); s.pop();
            int right = s.top(); s.pop();
            lwalker = left;
            rwalker = right;
            mid = a[(lwalker+rwalker)/2];
            while(lwalker < rwalker)
            {
                while(a[lwalker] < mid) lwalker++;
                while(a[rwalker] > mid) rwalker--;
                if(lwalker <= rwalker)
                {
                    int tmp = a[lwalker];
                    a[lwalker] = a[rwalker];
                    a[rwalker] = tmp;
                    lwalker++;
                    rwalker--;
                }
            }
            if(lwalker < right) push2(s, lwalker, right);
            if(rwalker > left) push2(s, left, rwalker);
        }
    }
    
    int main()
    {
        int a[10] = {0, 6,4,2,8,1,5,3,7,9};
        //quicksort(a, 0, 9);
        qsort(a, 0, 9);
        for(int i=0; i<10; i++)
            cout << a[i] << " ";
        return 0;
    }
  • 相关阅读:
    spring自定义标签
    shell脚本实战
    redis使用场景
    了解并安装Nginx
    查看jar包依赖树
    从一道索引数据结构面试题看B树、B+树
    11条sql技巧
    or/in/union与索引优化
    动态规划
    实现快速迭代的引擎设计
  • 原文地址:https://www.cnblogs.com/wouldguan/p/2737117.html
Copyright © 2020-2023  润新知