912.排序数组
给你一个整数数组 nums,请你将该数组升序排列。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-an-array/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
选择一个合适的排序算法解答即可,这里介绍下快速排序。
下面来自我的LeetCode题解
class Solution {
public int[] sortArray(int[] nums) {
quickSort(nums, 0, nums.length - 1);
return nums;
}
public void quickSort(int[] nums, int start, int end) {
if (start >= end) return;
int i = start - 1;
int j = end + 1;
int pivot = nums[(i + j) >>> 1];//选取数组中间位置的元素为划分元素,防止出现最大时间复杂度
while (i < j) {
do ++i; while(nums[i] < pivot);//为什么移动i和j指针的条件是q[i]<x和q[j]>x,而不是q[i]<=x和q[j]>=x?因为如果选取的x是数组里最大的数,那么一直都满足q[i]<=x,所以i会一直++发生越界都不会停下来。同理,如果选取的x是数组里最小的数,那么一直都满足q[j]>=x,所以j会一直发生越界都不会停下来。
do --j; while(nums[j] > pivot);//保证num[i]==nums[j]==pivot时,循环继续
if (i < j) {
swap(nums, i, j);
}
}
quickSort(nums, start, j);//试想q[i]和q[j]在i==j-1时停下来做交换的场景,交换完成之后i和j会各自前进(i++, j--)一步,形成i>j(具体是i==j+1)的不合法局面。在这个局面下,满足性质<= x的区间是[l,j]而不是[l,i],因此划分的两个区间是[l,j]、[j+1,r]。
quickSort(nums, j + 1, end);
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}