快速排序的非递归实现(栈)

/*
 *快速排序非递归基本思想:
 *    将每一段的头和尾放在栈中,在逐步出栈。
 * 首先先建一个栈或者调用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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值