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

来源:互联网 发布:由于网络原因上传失败 编辑:程序博客网 时间:2024/06/01 07:57
/* *快速排序非递归基本思想: *    将每一段的头和尾放在栈中,在逐步出栈。 * 首先先建一个栈或者调用STL(标准模板库)中 * 栈函数。在<stack.h>头文件中。*/#include <iostream>#include <stack>#include <iomanip>using namespace std;#define Size 20typedef 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 0
原创粉丝点击