练习一 : 颜色分类

java
class Solution {
public void sortColors(int[] nums) {
int len = nums.length;
int left = -1;//0元素的最右端
int right = len;//2元素的最左端
for(int i = 0;i<right;){
if(nums[i] == 0){
swap(nums,++left,i++);
}else if(nums[i] == 1){
i++;
}else{
swap(nums,--right,i);
}
}
}
public void swap(int[] nums,int i,int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
算法原理 :
① 指针含义
i : 用来遍历数组
left : 用来标记 0 的最右端 , 包含 left
right : 用来标记 2 的最左端 , 包含 right
② 区间表示
0,left\] 为 0 ; \[left+1,i-1\] 为 1 ; \[i,right-1\] 为待排序元素 ; \[right,len-1\] 为 2
③ 交换元素

**如果 i 位置为 0 :** 需要交换 left+1 和 i , 此时如果 i==++left , 是自己根自己交换 ; 交换完成 i++ ; 注意 : 由于 left+1 位置为已经排好序了的元素 , 所以能让 i++
**如果 i 位置为 1** : 仅需要将 i++
**如果 i 位置为 2** : 需要交换 right-1 和 i , 此时如果 i == --right,也是自己自己跟自己交换 , 交换完成退出循环(因为此时 i == right)
## 练习二 : 排序数组(快排)
[912. 排序数组 - 力扣(LeetCode)](https://leetcode.cn/problems/sort-an-array/ "912. 排序数组 - 力扣(LeetCode)")

```java
class Solution {
public int[] sortArray(int[] nums) {
qsort(nums,0,nums.length-1);
return nums;
}
public void qsort(int[] nums,int l,int r){
if(l>=r) return ;
int key = nums[new Random().nextInt(r-l+1)+l];
int left = l-1, right = r+1;
for(int i = l;i