快速排序算法 -- 非递归方式

快速排序算法的例子中经常使用的是递归方式实现的。但递归算法的效率并不高,开销也较大。

此例子是使用了栈方式来代替递归方式实现了快速排序算法,可以在工作中参考一下。

算法中栈内存储的是待排序数组的数组标,对每次划分后的起始点和终止点进行压栈操作,然后从栈顶弹出一对起始点和终止点,再次进行快速排序的划分操作。


完整的算法(包括栈的实现的方法请到以下链接下载)

http://download.csdn.net/detail/wangzhiyu1980/4730049

main.cpp

#include <iostream>
#include "mt_stack.h"

using namespace std;

void swap(int nA, int nB)
{
    int nTmp = 0;
    nTmp = nA;
    nA   = nB;
    nB   = nTmp;
}

int split(void** pData, int nStart, int nEnd)
{
    int nLow  = nStart;
    int nHigh = nEnd;
    int nMid  = nStart;

    int i = nLow;
    int j = nHigh;

    while (i < j)
    {
        while ((i < j) && (pData[nMid] > pData[i]))
        {
            i++;
        }

        while ((nMid < j) && (pData[nMid] < pData[j]))
        {
            j--;
        }

        if (i < j)
        {
            swap((int*)pData[i], (int*)pData[j]);
        }
    }
    return j;
}

void quickSort(void** pData, int nStart, int nEnd)
{
    int nStackSize = nEnd - nStart;
    int nMid = 0;
    int nLow, nHigh;
    int* pTmp;


    if (nStart >= nEnd)
        return;

    MT_Stack *pStack = new MT_Stack(nStackSize);

    cout << "push:" << "(" << nStart << ", "<< nEnd << ")"<< endl;
    pStack->Push(nStart);
    pStack->Push(nEnd);


    while(!pStack->IsEmpty())
    {
        pTmp   = (int*)pStack->Pop();
        nHigh  = *pTmp;
        delete(pTmp);

        pTmp  = (int*)pStack->Pop();
        nLow  = *pTmp;
        delete(pTmp);

        cout << "pop:"<< "(" << nLow << ", "<< nHigh << ")"<< endl;

        if (nLow < nHigh)
        {
            nMid = split(pData, nLow, nHigh);

            if (nMid > nLow)
            {
                cout << "push:" << "(" << nLow << ", "<< nMid << ")"<< endl;
                pStack->Push(nLow);
                pStack->Push(nMid);
            }

            if (nMid < nHigh)
            {
                cout << "push:" << "(" << nMid+1 << ", "<< nHigh << ")"<< endl;
                pStack->Push(nMid+1);
                pStack->Push(nHigh);
            }
        }
    }

}


int main()
{
    int arr[10] = {28, 203, 34, 19, 95, 82, 91, 643, 8293, 8487};

    for (int i = 0; i < 10; i++)
        cout << arr[i] << "  ";

    cout << endl;
    quickSort((void**)arr, 0, 9);

    for (int i = 0; i < 10; i++)
        cout << arr[i] << "  ";

    cout << endl;
    return 0;
}



测试结果

28  203  34  19  95  82  91  643  8293  8487
Create MT_Stack
push:(0, 9)
pop:(0, 9)

push:(1, 9)
pop:(1, 9)

push:(2, 9)
pop:(2, 9)

push:(3, 9)
pop:(3, 9)

push:(4, 9)
pop:(4, 9)

push:(5, 9)
pop:(5, 9)

push:(6, 9)
pop:(6, 9)

push:(7, 9)
pop:(7, 9)

push:(8, 9)
pop:(8, 9)

push:(9, 9)
pop:(9, 9)


19  28  34  82  91  95  203  643  8293  8487


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值