Featured image of post Sort An Array

Sort An Array

912. 排序数组

分析

  1. 选取基准:选择当前区间的第一个元素 nums[l] 作为基准 x
  2. 双指针划分:
    • 使用 i 从左向右找大于等于 x 的元素
    • 使用 j 从右向左找小于等于 x 的元素
    • 交换 nums[i]nums[j],直到 i >= j,此时 j 是分界点
  3. 递归排序:
    • 递归地对 [l, j][j + 1, r] 两部分继续快速排序,直到 l >= r

时间复杂度

时间复杂度 O(nlogn)

空间复杂度

空间复杂度为 O(logn)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/***        quick sort      ***/
class Solution
{
public:
    // 快速排序函数
    void quick_sort(std::vector<int>& nums, int l, int r)
    {
        if (l >= r) // 递归终止条件
            return;

        int x = nums[l], i = l - 1, j = r + 1;

        // 双指针划分
        while (i < j)
        {
            do ++i; while (nums[i] < x); // 找到大于等于 x 的元素
            do --j; while (nums[j] > x); // 找到小于等于 x 的元素
            if (i < j)
                std::swap(nums[i], nums[j]); // 交换不符合位置的元素
        }

        quick_sort(nums, l, j);   // 递归处理左半部分
        quick_sort(nums, j + 1, r); // 递归处理右半部分
    }

    vector<int> sortArray(vector<int>& nums)
    {
        quick_sort(nums, 0, nums.size() - 1);
        return nums;
    }
};
Built with Hugo
Theme Stack designed by Jimmy