leader面问了一个快排的非递归实现,一下子蒙了。
因为平常从来都是递归的快排,当时只想到递归变非递归肯定要用到栈,但怎么也想不出来,今天来补一下。
先把递归的写一下吧
int Partition(vector<int>& nums, int left, int right)
{
//随机化一下
int m = left + (rand() % (right - left + 1));
int temp = nums[left];
nums[left] = nums[m];
nums[m] = temp;
int flag = nums[left];
while (left < right)
{
while (left < right && nums[right] >= flag) right--;
if (left < right)
{
nums[left] = nums[right];
left++;
}
while (left < right && nums[left] < flag) left++;
if (left < right)
{
nums[right] = nums[left];
right--;
}
}
nums[left] = flag;
return left;
}
void qSort(vector<int>& nums, int left, int right)
{
if (left >= right)
{
return;
}
int pos = Partition(nums, left, right);
qSort(nums, left, pos - 1);
qSort(nums, pos + 1, right);
}
下面是非递归,非递归的思路就是用栈来记录哪一段没有排序,然后不断的出栈对这一段进行排序,思路确实不难。。当时紧张的环境下确实是蒙了。
int Partition(vector<int>& nums, int left, int right)
{
//随机化一下
int m = left + (rand() % (right - left + 1));
int temp = nums[left];
nums[left] = nums[m];
nums[m] = temp;
int flag = nums[left];
while (left < right)
{
while (left < right && nums[right] >= flag) right--;
if (left < right)
{
nums[left] = nums[right];
left++;
}
while (left < right && nums[left] < flag) left++;
if (left < right)
{
nums[right] = nums[left];
right--;
}
}
nums[left] = flag;
return left;
}
void qSort(vector<int>& nums, int left, int right)
{
if (left >= right)
{
return;
}
stack<int> st;
int pos = Partition(nums, left, right);
if (left < pos - 1)
{
st.push(left);
st.push(pos - 1);
}
if (right > pos + 1)
{
st.push(pos + 1);
st.push(right);
}
while (!st.empty())
{
int end = st.top();
st.pop();
int start = st.top();
st.pop();
int i = Partition(nums, start, end);
if (start < i - 1)
{
st.push(start);
st.push(i - 1);
}
if (end > i + 1)
{
st.push(i + 1);
st.push(end);
}
}
return;
}