leetcode912:排序数组

题目没什么好说的,就是用排序算法得到从大到小的数组。

目前只会冒泡排序- -毫无意外的超出时间限制了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    vector<int> sortArray(vector<int>& nums) {
        for(int i = 0; i < nums.size(); i ++)
        {
            for(int j = 0; j < nums.size()-i-1; j ++)
            {
                if(nums[j] > nums[j+1])
                {
                    int temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                }
            }
        }
        return nums;
    }

于是就学习了有着分治思想的快速排序法。简单来说,快排就是一个填坑的过程,也是一个递归的过程。首先需要定义一个基准值,以及左右指针,排序一次就可以把这个基准值挪到正确的位置,即把小于它的值挪到左边,大于它的值挪到右边。排完这一次之后,排它的左右子数组,递归下去只到左右子数组的个数分别都为1。

推荐看菜鸟教程,比较容易看懂。

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
32
33
34
35
36
37
38
39
40
    void quicksort(vector<int> &nums, int left, int right)
    {
        if(left< right)
        {
            int i = left, j = right, temp = nums[left];
            while(i < j)
            {
              //从右往左找小于temp的值
                while(i < j && nums[j]  > temp)
                {
                    j--;
                }
                //找到了就填坑,填到左指针处,左指针++
                if(i<j)
                {
                    nums[i++] = nums[j];
                }
                //然后从左往右找大于temp的值
                while(i < j && nums[i] <  temp)
                {
                    i++;
                }
                //找到了就填坑,填到右指针处,右指针--
                if(i < j)
                {
                    nums[j--]=nums[i];
                }
            }
            //一轮完之后,也就是两个指针指向一个位置后,把基准值填进这个坑
            nums[i] = temp;     //把基准值填入正确位置
            //递归快排当前指针的左右
            quicksort(nums,left,i-1);
            quicksort(nums,i+1,right);
        }
       
    }
    vector<int> sortArray(vector<int>& nums) {
        quicksort(nums,0,nums.size()-1);
        return nums;
    }```