我很难实现 Hoare 的分区算法。基本上,我想要做的是将一个数组分成两部分,第一部分包含小于给定的数字x
,另一部分包含更大的数字。但是,我只是想不出一个好的实现。这是我的代码:
void hoare(vector<int>&arr,int end, int pivot)
{
int i = 0;
int j = end;
while (i < j)
{
while (arr[i] < pivot)
i += 1;
while (arr[j] > pivot)
j -= 1;
swap(arr[i],arr[j]);
}
// return arr;
for (int i=0; i<end; i++)
printf("%d ", arr[i]);
}
现在我发现很多网站都有 while 而(arr[i] <= pivot)
不是我放在那里的。但是,当我这样做时,对于这样的数组:
1 3 5 7 9 2 4 6 8
我得到:
1 3 5 4 9 2 7 6 8
但话又说回来,在我的版本中,对于这样一个集合:
12 78 4 55 4 3 12 1 0
程序冻结,因为由于外部循环中的条件都没有得到满足,所以它只是一遍又一遍地遍历它,而不增加j
or i
。
枢轴是指向数组中特定数字的指针,从 1 开始计数;例如,在第一个示例中传递给函数的数字 3 表示pivot
equals arr[2]
,即 5
抱歉,如果这是一个菜鸟问题或已经回答,但我已经花了一整天的时间(也在网上寻找解决方案)无济于事,现在我有自杀的念头。
提前致谢。