给你一个整数数组
nums
,请你将该数组升序排列。
java:
import java.util.*;
class Solution {
public int[] sortArray(int[] nums) {
int len = nums.length;
quickSort(nums, 0, len-1);
return nums;
}
//快排主函数
public void quickSort(int[] nums, int low, int high){
if(low>=high){
return;
}
int pIndex = partition(nums, low, high);
quickSort(nums, low, pIndex-1);
quickSort(nums, pIndex+1, high);
}
//分割函数,
public int partition(int[] nums, int low, int high){
Random r = new Random();
int randomIndex = r.nextInt(high-low+1)+low; //设定基准值的索引
swap(nums, low, randomIndex); //将索引放在最左
int pivot = nums[low]; //基准值
int left = low; //指向当前小于基准值的最后一个值
for(int i=low+1; i<=high; i++){
if(nums[i]<pivot){
left++; //指向大于基准值的值
swap(nums, i, left); //将新遍历的小于基准值的值和大于基准值的值互换
}
}
swap(nums, left, low); //将小于基准值的最后一个值和基准值互换
return left; //返回基准值的索引
}
//交换函数
public void swap(int[] nums, int index1, int index2){
int temp = nums[index1];
nums[index1] = nums[index2];
nums[index2] = temp;
}
}
注意:
- 将基准值的索引随机定下,是一个提高效率的方向
- 先选一个基准值,得到它在整个数组的索引(partition),然后按照索引将数组分为两部分(quickSort)