912. 排序数组
给你一个整数数组 nums,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
递归方法
相信递归方法大家闭着眼也能写出来,毕竟这是各大互联网公司面试必手撕的代码
#include<iostream>
#include<map>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
void QuickSort(vector<int>& nums, int left, int right)
{
if (left > right) return;
int i = left, j = right;
int pivot = nums[i];
while (i < j)
{
while (i<j && nums[j]>=pivot) j--;
nums[i] = nums[j];
while (i < j && nums[i] < pivot) i++;
nums[j] = nums[i];
}
nums[i] = pivot;
QuickSort(nums, left, i - 1);
QuickSort(nums, i + 1, right);
}
vector<int> sortArray(vector<int>& nums) {
QuickSort(nums, 0, nums.size() - 1);
return nums;
}
int main()
{
vector<int> v = { 5,1,1,2,0,0};
v = sortArray(v);
for (auto& x : v)
{
cout << x << " ";
}
cout << endl;
system("pause");
return 0;
}
非递归方法
一看到非递归,自然又想到了栈stack,类似的是二叉树的非递归遍历:
C++之二叉树的非递归遍历-栈迭代
void QuickSort(vector<int>& nums, int begin, int end)
{
stack<int> s;
s.push(end);
s.push(begin);
while (!s.empty())
{
int low = s.top();
s.pop();
int high = s.top();
s.pop();
int i = low, j = high;
if (i >= j) continue;//这一步很关键,不然无限循环
int pivot = nums[i];
while (i < j)
{
while (i < j && nums[j] >= pivot) j--;
nums[i] = nums[j];
while (i < j && nums[i] < pivot) i++;
nums[j] = nums[i];
}
nums[i] = pivot;
//从右往左,从高到低
s.push(high);
s.push(i + 1);
//注意存的不是begin和end,而是循环新生成的两端
s.push(i - 1);
s.push(low);
}
return;
}
vector<int> sortArray(vector<int>& nums) {
QuickSort(nums, 0, nums.size() - 1);
return nums;
}