2025年--Lc209- 75. 颜色分类(排序)--Java版
1.题目

2.思路
(1)快速排序:快速排序(Quick Sort)是一种高效的排序算法,基于分治法(Divide and Conquer)的思想。它的核心是通过选择一个基准元素(pivot),将列表分为两部分:一部分小于基准元素,另一部分大于基准元素,然后递归地对这两部分进行排序。快速排序的平均时间复杂度为 O(n log n)。
. 算法步骤
1)选择基准元素:从列表中选择一个元素作为基准(pivot)。选择方式可以是第一个元素、最后一个元素、中间元素或随机元素。
2)分区:将列表重新排列,**使得所有小于基准元素的元素都在基准的左侧,所有大于基准元素的元素都在基准的右侧。**基准元素的位置在分区完成后确定。
3)递归排序:对基准元素左侧和右侧的子列表分别递归地进行快速排序。
4)合并:由于分区操作是原地进行的,递归结束后整个列表已经有序。
(2)冒泡排序

每次都把次小的元素确定
3.代码实现
方法一(快速排序):
class Solution {
public void sortColors(int[] nums) {quickSort(nums, 0, nums.length - 1);}private static void quickSort(int[] a, int l, int r) {if (l >= r) return;int p = partition(a, l, r);quickSort(a, l, p - 1);quickSort(a, p + 1, r);}private static int partition(int[] a, int l, int r) {int pivot = a[r];int i = l; // a[l..i-1] < pivotfor (int j = l; j < r; j++) {if (a[j] < pivot) {swap(a, i, j);i++;}}swap(a, i, r); // 把 pivot 放到中间return i;}private static void swap(int[] a, int i, int j) {int t = a[i]; a[i] = a[j]; a[j] = t;}
}
补充:快速排序常见写法
public class QuickSort implements IArraySort {@Overridepublic int[] sort(int[] sourceArray) throws Exception {// 对 arr 进行拷贝,不改变参数内容int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);return quickSort(arr, 0, arr.length - 1);}private int[] quickSort(int[] arr, int left, int right) {if (left < right) {int partitionIndex = partition(arr, left, right);quickSort(arr, left, partitionIndex - 1);quickSort(arr, partitionIndex + 1, right);}return arr;}private int partition(int[] arr, int left, int right) {// 设定基准值(pivot)int pivot = left;int index = pivot + 1;for (int i = index; i <= right; i++) {if (arr[i] < arr[pivot]) {swap(arr, i, index);index++;}}swap(arr, pivot, index - 1);return index - 1;}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}
方法二:冒泡排序
class Solution {public void sortColors(int[] nums) {int n=nums.length;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(nums[i]>nums[j]){int temp=nums[i];nums[i]=nums[j];nums[j]=temp;}}}}}
方法三:计数
class Solution {
public void sortColors(int[] nums) {int cnt0=0;int cnt1=0;int cnt2=0;int n=nums.length;for(int i=0;i<n;i++){switch(nums[i]){case 0:cnt0++;break;case 1:cnt1++;break;case 2:cnt2++;break;}}for(int i=0;i<cnt0;i++){nums[i]=0;}for(int i=0;i<cnt1;i++){nums[i+cnt0]=1;}for(int i=0;i<cnt2;i++)nums[i+cnt0+cnt1]=2;
}
}
class Solution {
public void sortColors(int[] nums) {int cnt0=0;int cnt1=0;int cnt2=0;int n=nums.length;for(int i=0;i<n;i++){if(nums[i]==0){cnt0++;}else if(nums[i]==1){cnt1++;}else{cnt2++;}}for(int i=0;i<cnt0;i++){nums[i]=0;}for(int i=0;i<cnt1;i++){nums[i+cnt0]=1;}for(int i=0;i<cnt2;i++)nums[i+cnt0+cnt1]=2;
}
}
