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];
        }
    }
}

posted @   你也要来一颗长颈鹿吗  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示