题目:
给你一个整数数组 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实现代码:
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都是当前区间的最大值或最小值,相当于冒泡排序了。