/*
*快速排序非递归基本思想:
* 将每一段的头和尾放在栈中,在逐步出栈。
* 首先先建一个栈或者调用STL(标准模板库)中
* 栈函数。在<stack.h>头文件中。
*/
#include <iostream>
#include <stack>
#include <iomanip>
using namespace std;
#define Size 20
typedef int DataType;
typedef int Position;
int GetPositon(DataType digit[], const int low, const int high);
void QuickSortStack(DataType digit[], const int low, const int high);
void PaintQuickSort(DataType digit[], const int lengthOfDigit);
int main(void)
{
DataType digit[Size] = {
23, 25, 45, 78, 89,
12, 45, 65, 43, 32,
98, 54, 32, 54, 32,
21, 34, 54, 22, 34};
PaintQuickSort(digit, Size);
QuickSortStack(digit, 0, Size-1);
PaintQuickSort(digit, Size);
return 0;
}
int GetPositon(DataType digit[], const int low, const int high)
{
Position i = low;
Position j = high;
DataType temp = digit[low];//取最小值作为标准值
while(i < j)
{//当i == j时退出
while(i < j && temp < digit[j]) j--;//在标准值的右侧扫描
if(i < j)
{
digit[i] = digit[j];
i++;
}
while(i < j && temp > digit[i]) i++;//在标准值的左侧进行扫描
if(i < j)
{
digit[j] = digit[i];
j--;
}
}
digit[i] = temp;// digit[j] = temp 也可以
return i;//return j;都可以因为 i == j
}
void QuickSortStack(DataType digit[], const int low, const int high)
{
stack<DataType> st;
Position mid;
if(low < high)
{
mid = GetPositon(digit, low, high);//这几步是在设置第一步操作
if(low < mid) //
{ //
st.push(low); //
st.push(mid-1); //
} //
if(mid < high) //这几步是在设置第一步操作
{ //
st.push(mid+1); //
st.push(high); //
} //
while(!st.empty() && st.size() %2 == 0)//栈中元素以成对存在的
{
Position top = st.top();//取出高端
st.pop();
Position bottom = st.top();//取出低端
st.pop();
mid = GetPositon(digit, bottom, top);
if( bottom < mid)
{
st.push(bottom);
st.push(mid-1);
}
if( mid < top)
{
st.push(mid+1);
st.push(top);
}
}
}
}
//输出
void PaintQuickSort(DataType digit[], const int lengthOfDigit)
{
for(int i = 0; i < lengthOfDigit; i++)
cout<<digit[i]<<" ";
cout<<endl<<endl;
}
快速排序的非递归实现(栈)
最新推荐文章于 2024-01-24 08:00:00 发布