快速排序是一种基于分治思的算法,可以简单的把它拆解为四步:
- 从数列中挑出一个元素,称为 “基准”(pivot);
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面
- 在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
下面我们使用一个例子来介绍快速排序的使用
我们给定一个整数数组 nums,我们使用快速排序将它升序排列。
例子:
输入:nums = [5,2,3,1] 输出:[1,2,3,5]
接下来我们通过写代码实现快速排序:
public class QuickSortTest {
public int[] sortArray(int[] nums) {
quickSort(nums,0,nums.length-1);
return nums;
}
//快速排序
private void quickSort(int[] nums,int left,int right){
if(left > right){
return;
}
//定义基准位置为最左边的位置
int base = nums[left];
int i = left;
int j = right;
//如果i和j指针不相遇的时候
while(i != j){
//如果j此时还在i的右边 且 j位置的值大于基准位置的值 此时j指针向左移动
while(nums[j] >= base && j > i){
j--;
}
//如果i此时还在j的左边 且 i位置的值小于于基准位置的值 此时i指针向右移动
while(nums[i] <= base && i < j){
i++;
}
//此时i<j 且 j位置的值小于基准值 i位置的值大于基准值 交换i和j的位置
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
//此时i和j的指针已经移动到一个位置 此时交换基准值与i此时的位置的值
nums[left] = nums[i];
nums[i] = base;
//第一次执行下来 此时i就是成为一个分割线 i左边的都比i位置的值小 i右边的都比i位置的值要大。
//然后分别对分割的2边继续快速排序
quickSort(nums,left,i-1);
quickSort(nums,i+1,right);
}
}
这样就能实现通过快速排序满足上面的升序要求。