天天看點

快速排序非遞歸 java_非遞歸的方式實作快速排序

前段看到過一個問題(忘記在哪裡了),用非遞歸的方式實作快速排序,今天又翻了出來,把代碼貼上,給自己以後留個參考,代碼中包括自己當時對程式改進的過程,請大家多提意見。

#include

"stdafx.h"

#include

#include

#define

MAX_SIZE10

using

namespace std;

typedef

int elem;

typedef

std::stack Stack;

int

partition(elem *pData, int low, int high);

void

swap(elem& a, elem& b);

void

qsort(elem* pData, int low, int high);

void

qsort2(elem* pData, int low, int high);

void

qsort3(elem* pData, int low, int high);

int

partition(elem *pData, int low, int high)

{

elem key = pData[low];

while(low < high)

{

while(low < high && pData[high] >= key)

high--;

swap(pData[low], pData[high]);

while(low < high && pData[low] <= key)

low++;

swap(pData[low], pData[high]);

}

return low;

}

void swap(elem& a, elem& b)

{

if(&a != &b)

{

a ^= b;

b ^= a;

a ^= b;

}

}

//這個是原始的算法

void

qsort(elem* pData, int low, int high)

{

if(low < high)

{

int pivot = partition(pData, low, high);

qsort(pData, low, pivot - 1);

qsort(pData, pivot + 1, high);

}

}

//這個是第一次轉化成遞歸以後的算法

void

qsort2(elem* pData, int low, int high)

{

Stack st;

if(low < high)

{

int pivot = partition(pData, low, high);

st.push(low);

st.push(pivot - 1);

st.push(pivot + 1);

st.push(high);

while(!st.empty())

{

high = st.top();

st.pop();

low = st.top();

st.pop();

pivot = partition(pData, low, high);

if(low < high)

{

st.push(low);

st.push(pivot - 1);

st.push(pivot + 1);

st.push(high);

}

}

}

}

//這個是轉化成遞歸以後改進的算法

void qsort3(elem* pData, int low, int high)

{

Stack st;

int tmp;

if(low < high)

{

int pivot = partition(pData, low, high);

st.push(low);

st.push(pivot - 1);

st.push(pivot + 1);

st.push(high);

while(!st.empty())

{

high = st.top();

st.pop();

low = st.top();

st.pop();

if(low < high)

{

pivot = partition(pData, low, high);

tmp = pivot - 1;

if(low < tmp)

{

st.push(low);

st.push(tmp);

}

tmp = pivot + 1;

if(tmp < high)

{

st.push(tmp);

st.push(high);

}

}

}

}

}

//測試代碼

int _tmain(int argc, _TCHAR* argv[])

{

elem data[MAX_SIZE] = {12, 1, 13, 14, 67, 23, 12, 3, 90, 76};

//qsort(data, 0, MAX_SIZE - 1);

//qsort2(data, 0, MAX_SIZE - 1);

qsort3(data, 0, MAX_SIZE - 1);

for(int i=0; i< MAX_SIZE; i++)

{

cout << data[i] << " ";

}

cout << endl;

cin.get();

return 0;

}

posted on 2007-02-14 09:42 DexterChen 閱讀(4254) 評論(4)  編輯 收藏 引用 所屬分類: C++ 、Algorithms