标准快速排序(非递归)

#include <stdio.h>
#include <stack>

using namespace std;

void exch(int& a, int &b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

int partition(int a[], int l, int r)
{
    int i=l-1;
    int j=r;
    int val = a[r];
    while(1)
    {
        while(val > a[++i]);
        while(val < a[--j])
            if(j == l) break;
        if(i >= j) break;
        exch(a[i], a[j]);
    }
    exch(a[i], a[r]);
    return i;
}

inline void push2(stack<int> &s, int a, int b)
{
    s.push(b);
    s.push(a);
}

void quicksort(int a[], int l, int r)
{
    stack<int> s;
    push2(s, l, r);
    while(!s.empty())
    {
        l = s.top();
        s.pop();
        r = s.top();
        s.pop();
        if(l >= r) continue;
        int i = partition(a, l, r);
        //because of the size of stack
        if(i-l > r-i)
        {
            push2(s, l, i-1);
            push2(s, i+1, r);
        }
        else
        {
            push2(s, i+1, r);
            push2(s, l, i-1);
        }
    }
}


int main()
{
    int a[10] = {4,3,6,5,3,1,8,9,6,5};
    quicksort(a, 0, 9);
    for(int i=0; i<10; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}
posted @ 2012-11-11 20:37  wouldguan  阅读(301)  评论(0编辑  收藏  举报