【发布时间】:2011-11-04 02:47:05
【问题描述】:
我很难将带有 Hoare 分区的 QuickSort 转换为 C 代码,但不知道原因。我正在使用的代码如下所示:
void QuickSort(int a[],int start,int end) {
int q=HoarePartition(a,start,end);
if (end<=start) return;
QuickSort(a,q+1,end);
QuickSort(a,start,q);
}
int HoarePartition (int a[],int p, int r) {
int x=a[p],i=p-1,j=r;
while (1) {
do j--; while (a[j] > x);
do i++; while (a[i] < x);
if (i < j)
swap(&a[i],&a[j]);
else
return j;
}
}
另外,我真的不明白为什么HoarePartition 有效。有人可以解释它为什么有效,或者至少将我链接到一篇有效的文章吗?
我已经看到了分区算法的逐步完成,但我对它没有直观的感觉。在我的代码中,它甚至似乎都不起作用。例如,给定数组
13 19 9 5 12 8 7 4 11 2 6 21
它将使用枢轴 13,但以数组结尾
6 2 9 5 12 8 7 4 11 19 13 21
并将返回j,即a[j] = 11。我认为从该点开始并继续前进的数组应该具有都大于枢轴的值,但这里不是这样,因为 11
这里是 Hoare 分区的伪代码(来自 CLRS,第二版),如果有用的话:
Hoare-Partition (A, p, r)
x ← A[p]
i ← p − 1
j ← r + 1
while TRUE
repeat j ← j − 1
until A[j] ≤ x
repeat i ← i + 1
until A[i] ≥ x
if i < j
exchange A[i] ↔ A[j]
else return j
谢谢!
编辑:
解决这个问题的正确 C 代码最终会是:
void QuickSort(int a[],int start,int end) {
int q;
if (end-start<2) return;
q=HoarePartition(a,start,end);
QuickSort(a,start,q);
QuickSort(a,q,end);
}
int HoarePartition (int a[],int p, int r) {
int x=a[p],i=p-1,j=r;
while (1) {
do j--; while (a[j] > x);
do i++; while (a[i] < x);
if (i < j)
swap(&a[i],&a[j]);
else
return j+1;
}
}
【问题讨论】:
-
是的,我有,已编辑原始答案
-
我认为您编辑了组织问题。
-
检查您的数据样本,您从 12 到 11 个元素(缺少 13 个)。那不可能。
-
我不明白为什么它不适用于两个元素? if (end-start
标签: c algorithm sorting quicksort data-partitioning