题目没什么好说的,就是用排序算法得到从大到小的数组。
目前只会冒泡排序- -毫无意外的超出时间限制了。
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; }``` |