void daulPivotQuickSortRecursive(int* array, int left, int right) {
if (left >= right) return;
int i = left;
int j = right;
int k = i + 1;
// 小于等于pivot1:区间A=[left, i]
// 大于等于pivot2:区间B=[j, right]
// 两者之间:区间C=[i+1, k-1]
// 待处理:区间D=[k, j-1]
// 对两个轴处理
if (array[left] > array[right]) {
swap(&array[left], &array[right]);
}
int pivot1 = array[left];
int pivot2 = array[right];
while (k < j) {
if (array[k] > pivot1 && array[k] < pivot2) {
k++;
} else if (array[k] <= pivot1) {
// 把C的首个元素与当前元素交换,首个元素还在C中
swap(&array[++i], &array[k++]);
} else if (array[k] >= pivot2) {
// 从右往左找第一个比pivot2小的元素
while (k < j && array[j] >= pivot2) {
j--;
}
// k不用自增,j也不用自减
swap(&array[k], &array[j]);
}
}
// 把轴移到该放的位置
swap(&array[left], &array[i]);
swap(&array[right], &array[j]);
// 对两个轴分出的三个区间进行递归调用
daulPivotQuickSortRecursive(array, left, i - 1);
daulPivotQuickSortRecursive(array, i + 1, j - 1);
daulPivotQuickSortRecursive(array, j + 1, right);
}
// 12.双轴快排
void daulPivotQuickSort(int* array, int size) {
daulPivotQuickSortRecursive(array, 0, size - 1);
display(array, size);
}