🛸~~ 🚁🚁🚁🛩️🛩️🛩|

n1ce2cv

园龄:5年2个月粉丝:4关注:1

双轴快排

  • 双轴快排
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);
}

本文作者:n1ce2cv

本文链接:https://www.cnblogs.com/sprinining/p/16229599.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   n1ce2cv  阅读(39)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起