非递归实现快速排序

非递归实现快速排序
在前2个Posts中,使用了递归的方式实现快速排序算法,如果想
去掉递归,则我们需要使用栈数据结构,

//为数组分区,返回新的支点位置(前2个Posts中已经实现)
int partition(int array[], int left, int right);

//记录数组信息的结构
typedef struct _qsort_range {
        int left, right;
}qsort_range;

//记录数组信息的栈
typedef stack<qsort_range, list<qsort_range> > range_stack;

//用非递归方法实现快速排序
void qsort2(int array[], int left, int right)
{
        /*数组分区*/
        int pos = partition(array, left, right);
        if (pos == -1) return;

        range_stack s;
        if (pos >= left) {
                /*左子数组left、right信息保存,注意:先左再右*/
                if (pos + 1 < right) {
                        qsort_range r2;
                        r2.left = pos+1; r2.right = right;
                        s.push(r2);
                }
                /*右子数组left、right信息保存*/
                if (pos - 1 > left) {
                        qsort_range r1;
                        r1.left = left; r1.right=pos-1;
                        s.push(r1);
                }
        }

        /*模拟递归调用*/
        while (s.size() > 0) {
                /*出栈*/
                qsort_range r3 = s.top();
                s.pop();

                /*数组分区*/
                int pos3 = partition(array, r3.left, r3.right);
                if (pos3 != -1) {
                        /*子数组的left、right信息保存*/
                        if (pos3 >= r3.left) {
                                if (pos3 + 1 < r3.right) {
                                        qsort_range r31;
                                        r31.left = pos3+1; r31.right = r3.right;
                                        s.push(r31);
                                }
                                if (pos3 - 1 > r3.left) {
                                        qsort_range r32;
                                        r32.left = r3.left; r32.right=pos3-1;
                                        s.push(r32);
                                }
                        }
                }
        }
}

你可能感兴趣的:(非递归实现快速排序)