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