目录
今天小编带大家学习快速排序的非递归方法,当然这篇博客是基于大家已经掌握了快排的递归方法的,如果还有不会的童鞋,可以看看下面这篇博客呦~: 手把手教你快速排序(递归)
一.实现原理
首先我们需要一个栈。
我们知道,快速排序就是一个递归加分治的思想,在递归方法里,我们是把数列分成两部分,每个部分又分成两部分,直到不能再分为止。
所以我们可以用一个栈来存放数列两部分的头尾,排一次就让头尾出来,再把分好的两部分的头尾分别再入栈,再排再出,再入,直到不能再分成两部分为止。
原理图:
二.代码实现(c语言)
int _quickSortNonr(int* a, int left, int right)//栈实现快排子函数
{
int pivot = left;
int begin = left, end = right, key = a[left];
while (begin < end)
{
while (begin < end && a[end] >= key) end--;
a[pivot] = a[end];
pivot = end;
while (begin < end && a[begin] <= key) begin++;
a[pivot] = a[begin];
pivot = begin;
}
a[pivot] = key;
return pivot;
}
void quickSortNonr(int* a, int left, int right)//栈实现快排,非递归
{
stack<int> st;//C++ STL->#include<stack>
st.push(right);
st.push(left);
while (!st.empty())
{
int _left = st.top();
st.pop();
int _right = st.top();
st.pop();
int mid = _quickSortNonr(a, _left, _right);
if (mid + 1 < _right)
{
st.push(_right);
st.push(mid + 1);
}
if (_left < mid - 1)
{
st.push(mid - 1);
st.push(_left);
}
}
}
如有错误,敬请斧正,恳请点赞支持😗