题目描述
给你一个整数数组 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 <= 50000
-50000 <= nums[i] <= 50000
解法一:快排
class Solution {
public int[] sortArray(int[] nums) {
quicksort(nums,0,nums.length-1);
return nums;
}
public void quicksort(int nums[],int start,int end){
//别忘记递归终止条件
if(start>end) return;
int index=patition(nums,start,end);
quicksort(nums,start,index-1);
quicksort(nums,index+1,end);
}
public int partition(int nums[],int start,int end){
int pivot=nums[start];
int i=start,j=end+1;
while(true){
while(i<end&&nums[++i]<pivot){}
while(j>start&&nums[--j]>pivot){}
if(i>=j){
break;
}
swap(nums,i,j);
}
//是用start 而不是pivot
swap(nums,start,j);
return j;
}
public void swap(int[] nums,int a,int b){
int temp=nums[a];
nums[a]=nums[b];
nums[b]=temp;
}
}
解法二: 计数排序
class Solution {
public int[] sortArray(int[] nums) {
int max = -50001, min = 50001;
for (int num: nums) {
max = Math.max(num, max);
min = Math.min(num, min);
}
int[] counter = new int[max - min + 1];
for (int num: nums) {
counter[num - min]++;
}
int idx = 0;
for (int num = min; num <= max; num++) {
int cnt = counter[num - min];
while (cnt-- > 0) {
nums[idx++] = num;
}
}
return nums;
}
}