快速排序:每次选择一个枢轴,比枢轴大的元素放在数组的右半部分,比枢轴小的元素放在数组的左半部分。然后递归的进入数组的左右两半部分。如果要用非递归来实现,我们需要用栈来保存数组左右两半部分的边界。代码如下:
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); } } } }