给你一个整数数组 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 <= 5 * 10^4
-5 * 10^4 <= nums[i] <= 5 * 10^4
非常经典的排序算法,冒牌排序直接送上:
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
int n = nums.size();
for(int i = 0;i < n-1;i++)
{
int flag = 0;
for(int j = n-1;j > i;j--)
if(nums[j-1]>nums[j]){
swap(nums[j-1],nums[j]);
flag = 1;
}
if(flag == 0) break;
}
return nums;
}
};
但是时间超出限制,直接换个希尔排序算法:
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
// 希尔排序
// 让数组越来越有序(步长越来越短)。插入排序对于数组近乎有序更容易排序,冒泡排序每轮中让整个数组越来越有序
// 不只处理相邻的逆序对(步长可以大于 1)。插入排序、冒泡排序每次都只能看相邻的两个元素
// 如果整个数组中较小的元素靠后的话,将它移动到前面就很耗时
int n = nums.size();
for (int h: { 701, 301, 132, 57, 23, 10, 4, 1 }) {
for (int i = h; i < n; i++) {
int temp = nums[i];
int j = i - h;
while (j >= 0 && nums[j] > temp) {
nums[j + h] = nums[j];
j -= h;
}
nums[j + h] = temp;
}
}
return nums;
}
};