我一直在看《Cracking the Coding Interview》一书中的分区函数(5e,第 119 页)。我在下面复制了它:
int partition(int arr[], int left, int right){
int pivot = arr[(left + right) /2 ]; // Pick pivot point
while (left <= right) {
// Find element on left that should be on right
while (arr[left] < pivot) left++;
// Find the element on right that should be on left
while (arr[right] > pivot) right--;
// Swap elements, and move left and right indicies
if (left <= right) {
swap(arr, left, right); // swaps elements
left++;
right--;
}
}
return left;
}
给定这个数组:
1 2 3 4 5 6 3
这就是分区为我逐步解决的方式
- 4 是枢轴值。左 = 0,右 = 6
左 = 3,右 = 6。交换。
1 2 3 3 5 6 4
左 = 4,右 = 4。退出
但是,我最终得到的数组:
1 2 3 3 5 6 4
没有围绕 4 进行分区。我是否错误地执行了步骤或算法不正确?我已经仔细检查了我对算法的复制,并且我已经正确地复制了它。
另外,我不确定为什么分区会向左返回,它是否会返回枢轴?
我了解分区和快速排序的 Wikipedia 实现,但我试图了解这里发生的事情。