双轴快排

  • 双轴快排
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);
}
posted @ 2022-05-06 17:08  n1ce2cv  阅读(36)  评论(0编辑  收藏  举报