说明:使用递归及非递归两种方式实现快速排序

    1. 排序数组
      给你一个整数数组 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]

    提示:
    1 <= nums.length <= 50000
    -50000 <= nums[i] <= 50000

    1. class Solution {
    2. public:
    3. vector<int> sortArray(vector<int>& nums) {
    4. quickSort2(nums);
    5. return nums;
    6. }
    7. // 递归版本
    8. void quickSort1(vector<int>& nums, int start, int end) {
    9. if (start >= end) {
    10. return;
    11. }
    12. int mid = nums[start];
    13. int left = start, right = end;
    14. while (left < right) {
    15. while (left < right && nums[right] >= mid) --right;
    16. nums[left] = nums[right];
    17. while (left < right && nums[left] <= mid) ++left;
    18. nums[right] = nums[left];
    19. }
    20. nums[left] = mid;
    21. quickSort1(nums, start, left - 1);
    22. quickSort1(nums, left + 1, end);
    23. }
    24. // 非递归版本
    25. void quickSort2(vector<int>& nums) {
    26. stack<int> st;
    27. st.push(0);
    28. st.push(nums.size() - 1);
    29. int start = 0, end = 0;
    30. while(!st.empty()) {
    31. int end = st.top();
    32. st.pop();
    33. int start = st.top();
    34. st.pop();
    35. int mid = nums[start];
    36. int left = start, right = end;
    37. while (left < right) {
    38. while (left < right && nums[right] >= mid) --right;
    39. nums[left] = nums[right];
    40. while (left < right && nums[left] <= mid) ++left;
    41. nums[right] = nums[left];
    42. }
    43. nums[left] = mid;
    44. if (start < left - 1) {
    45. st.push(start);
    46. st.push(left - 1);
    47. }
    48. if (left + 1 < end) {
    49. st.push(left + 1);
    50. st.push(end);
    51. }
    52. }
    53. }
    54. };

    用时:33min,但是这两种快排写法在大数组的测试case都超时了。。。继续研究一下为什么。