我一直在查看“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
这就是分区为我分步的方法
left = 3,right = 6.交换。
1 2 3 3 5 6 4
left = 4,right = 4.退出
然而,阵列我最终得到:
1 2 3 3 5 6 4
未分区4.我是否错误地执行了步骤或算法是否错误?我已经仔细检查了我对算法的再现,并且我已经正确地复制了它。
另外,我不赞成为什么分区会向左返回,它是否会返回枢轴?
我理解维基百科对分区和快速排序的实现,但我试图围绕这里发生的事情。
答案 0 :(得分:4)
分区的目标是将阵列分成两个部分。第一段包含元素[1,2,3,3]。所有这些值都小于或等于4。第二部分包含元素[5,6,4]。所有这些值都大于或等于四。
分区函数返回第二个段开始的位置。在这种情况下,它从索引4开始。
答案 1 :(得分:0)
分区算法的目标是简单地获取一些元素集合(例如,您使用“数组”),然后围绕枢轴将该集合划分(分为两个部分),即左部分和右部分。
关于枢轴左侧和枢轴右侧的元素,应该有一些“规则”。 例如,左侧的所有元素将小于所选的轴,而右侧的所有元素将大于轴。
您还可以在以下视频中看到实施: describe-log-groups
希望有帮助!