LeetCode912 排序数组
题目
给你一个整数数组 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⁴
-5 * 10⁴ <= nums[i] <= 5 * 10⁴
方法
随机数快排
- 时间复杂度:O(nlogn),n为数组的长度
- 空间复杂度:O(h),递归深度
class Solution {
public int[] sortArray(int[] nums) {
randomizedQuickSort(nums,0,nums.length-1);
return nums;
}
private void randomizedQuickSort(int[] nums,int l,int r){
if(l<r){
int pos = randomizedPortition(nums,l,r);
randomizedQuickSort(nums,l,pos-1);
randomizedQuickSort(nums,pos+1,r);
}
}
private int randomizedPortition(int[] nums,int l,int r){
int i = new Random().nextInt(r-l+1)+l;
int piort = nums[i];
swap(nums,i,r);
i = l-1;
for(int j=l;j<r;j++){
if(nums[j]<=piort){
i = i+1;
swap(nums,i,j);
}
}
swap(nums,i+1,r);
return i+1;
}
private void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
堆排序
- 时间复杂度:O(nlogn),n为数组的长度
- 空间复杂度:O(1),
class Solution {
public int[] sortArray(int[] nums) {
int heapSize = nums.length-1;
buildMaxHeap(nums,heapSize);
for(int i = 0;i<nums.length-1;i++){
swap(nums,0,heapSize);
heapSize--;
maxHeapify(nums,heapSize,0);
}
return nums;
}
private void buildMaxHeap(int[] nums,int heapSize){
for(int i = heapSize/2;i>=0;i--){
maxHeapify(nums,heapSize,i);
}
}
private void maxHeapify(int[] nums,int heapSize,int i){
int l = i*2+1,r = i*2+2;
int large = i;
if(l<=heapSize&&nums[l]>nums[large]){
large = l;
}
if(r<=heapSize&&nums[r]>nums[large]){
large = r;
}
if(large!=i){
swap(nums,i,large);
maxHeapify(nums,heapSize,large);
}
}
private void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
归并排序
注意:第二段要从mid+1开始,不能从mid开始
- 时间复杂度:O()
- 空间复杂度:O()
class Solution {
int[] tmp;
public int[] sortArray(int[] nums) {
int length = nums.length;
tmp = new int[length];
mergeSort(nums,0,length-1);
return nums;
}
private void mergeSort(int[] nums,int l,int r){
if(l>=r) return;
int mid = (l+r)/2;
mergeSort(nums,l,mid);
mergeSort(nums,mid+1,r);
int i = l,j = mid+1,index = 0;
while (i<=mid&&j<=r){
if(nums[i]<nums[j]){
tmp[index++] = nums[i++];
}else{
tmp[index++] = nums[j++];
}
}
while (i<=mid){
tmp[index++] = nums[i++];
}
while (j<=r){
tmp[index++] = nums[j++];
}
for(int k=0;k<r-l+1;k++){
nums[k+l] = tmp[k];
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理