【LeetCode Hot100 | 每日刷题】排序数组

912. 排序数组 - 力扣(LeetCode)

题目:

给你一个整数数组 nums,请你将该数组升序排列。

你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。

    示例 1:

    输入:nums = [5,2,3,1]
    输出:[1,2,3,5]
    

    示例 2:

    输入:nums = [5,1,1,2,0,0]
    输出:[0,0,1,1,2,5]

    方法:快速排序 

    快速排序核心就是分而治之,在当前排序区间[L,R]选定一个元素X作为中间值,X可以是nums[L+1],nums[R-1],nums[(L+R)/2],下面我们选择nums[(L+R)/2]作为中间值,元素依次与X比较,小于X的元素在X左边,大于X的元素在X右边,并且再次递归排序左边的区间以及X右边的区间,直至整个数组完成排序。

    Java实现代码:

    class Solution {
        public int[] sortArray(int[] nums) {
            int n=nums.length;
            quicksort(nums,0,n-1);
            return nums;
        }
        public void quicksort(int []nums,int l,int r){
            if(l==r)return;
            int x=nums[(l+r)/2];
            int i=l-1;
            int j=r+1;
            while(i<j){
                do i++;while(nums[i]<x);
                do j--;while(nums[j]>x);
                if(i<j){
                    int tem=nums[i];
                    nums[i]=nums[j];
                    nums[j]=tem;
                }
            }
            quicksort(nums,l,j);
            quicksort(nums,j+1,r);
        }
    }

    平均时间复杂度:O(nlogn),最差时间复杂度为O(n^2),即每次取到的X都是当前区间的最大值或最小值,相当于冒泡排序了。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值