双轴快排
- 双轴快排
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步