快速排序:每次选择一个枢轴,比枢轴大的元素放在数组的右半部分,比枢轴小的元素放在数组的左半部分。然后递归的进入数组的左右两半部分。如果要用非递归来实现,我们需要用栈来保存数组左右两半部分的边界。代码如下:
int partition(vector<int> &nums, int start, int last)
{
int val = nums[last];
while (start < last)
{
while (start < last && nums[start] <= val)
start++;
if (start < last)
{
nums[last] = nums[start];
last--;
}
while (start < last && nums[last] >= val)
{
last--;
}
if (start < last)
{
nums[start] = nums[last];
start++;
}
}
nums[start] = val;
return start;
}
void quick_sort(vector<int> &nums, int start, int last)
{
if (start < last)
{
//保存数组两半部分的边界
stack<int> s;
s.push(start);
s.push(last);
//判断栈是否为空
while (!s.empty())
{
last = s.top();
s.pop();
start = s.top();
s.pop();
int pos = partition(nums, start, last);
//当前数组的左半部分边界入栈
if (pos - 1 > start)
{
s.push(start);
s.push(pos - 1);
}
//当前数组的右半部分边界入栈
if (pos + 1 < last)
{
s.push(pos + 1);
s.push(last);
}
}
}
}