快速排序模版
void QuickSort(int[]nums,int l,int r){
if(l<r){ //递归跳出条件
int q=partition(nums,l,r);//划分
QuickSort(nums,l,q-1);//依次对两个子表进行递归排序
QuickSort(nums,q+1,r);
}
}
int partition(int[]nums,int low,int high){//一趟划分
int i=low,j=high;
int pivot=nums[low];
while(i<j){
while(i<j&&nums[j]>=pivot)
--j;
nums[i]=nums[j]; //将比枢纽小对放到左端
while(i<j&&nums[i]<=pivot)
++i;
nums[j]=nums[i];
}
nums[i]=pivot; //枢纽最终存放位置
return i; //返回枢纽对最终存放位置
}
###############################################################################
###############################################################################
三指针
使用三指针来改进快速排序数组中有大量重复元素的情况“
快速排序代码的改进:
class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int[] pivotRange = partition(arr, low, high);
quickSort(arr, low, pivotRange[0]);
quickSort(arr, pivotRange[1], high);
}
}
private static int[] partition(int[] arr, int low, int high) {
int pivot = arr[low]; // 选择第一个元素作为枢纽元素
int lt = low; // 小于枢纽元素的指针
int gt = high; // 大于枢纽元素的指针
int i = low + 1; // 当前元素的指针
while (i <= gt) {
if (arr[i] < pivot) {
swap(arr, i, lt);
i++;lt++;
} else if (arr[i] > pivot) {
swap(arr, i, gt--);
gt--;
} else {
i++;
}
}
return new int[]{lt - 1, gt + 1};
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int[] arr = {5, 2, 9, 3, 7, 6, 8, 5, 4, 5};
quickSort(arr, 0, arr.length - 1);
for (int num : arr) {
System.out.print(num + " ");
}
}
}