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

来源:互联网 发布:世纪开元淘宝客服工资 编辑:程序博客网 时间:2024/05/16 19:27

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

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

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


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

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


原创粉丝点击