## 题目地址(912. 排序数组)
## 题目描述
```
给你一个整数数组 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
```
## 第一种解法
快速排序
Java Code
class Solution {
public int getIndex(int[] nums,int low,int high){
int tmp=nums[low];
while(low<high){
while(nums[high]>=tmp && low<high){
high--;
}
nums[low]=nums[high];//小于基准的元素往前放着
while(nums[low]<=tmp && low<high){
low++;
}
nums[high]=nums[low];//大于基准的元素往后放
}
nums[low]=tmp;//碰头就把tmp写进去就行
return low;//返回基准排好的位置
}
public void quick_sort(int[] arr,int low,int high){
if(low<high){
int index1=getIndex(arr,low,high);
quick_sort(arr,low,index1-1);
quick_sort(arr,index1+1,high);
}
}
public int[] sortArray(int[] nums) {
quick_sort(nums,0,nums.length-1);
return nums;
}
}
**复杂度分析**
令 n 为数组长度。
- 时间复杂度:$O(nlogn)$
- 空间复杂度:$O(n)$
第二种解法:
计数排序
定义一个足够长的数组,数组小标表示元素值,如果待排序数组元素i出现过一次,就将数组arr[i]的值加1,最后再定义一个与待排序数组等长数组nums1,遍历arr,依次将元素值从小到大填入到nums1中
class Solution {
public int[] sortArray(int[] nums) {
int[] arr1=new int[50000*2+1];
for(int i:nums){
arr1[i+50000]++;//统计元素出现次数
}
int[] nums1=new int[nums.length];
int a1=0;
for(int i=0;i<arr1.length;i++){//依次遍历,然后将出现次数不为0的元素填入到nums1中
for(int j=0;j<arr1[i];j++){
nums1[a1]=i-50000;
a1+=1;
}
}
return nums1;
}
}
时间复杂度:O(50000*2+1)
空间复杂度:O(50000*2+1)
这篇博客介绍了两种排序算法的应用。第一种是快速排序,通过选取基准元素并进行分区操作实现排序,时间复杂度为$O(nlogn)$。第二种是计数排序,通过统计每个元素出现的次数,然后重新分配元素到正确的位置,适用于数值范围较小的情况,时间复杂度为$O(n+k)$,其中k为数值范围。这两种方法在不同场景下各有优势。
410

被折叠的 条评论
为什么被折叠?



