众所周知,在quicksort中你可以使用Lomuto-Partition。我检查了很多引用,几乎所有引用都提出了以下实现:
int L_partition(int *a, int l, int r)
{
int i, j, p, t;
p = a[r];
i = l - 1;
for(j =l; j <= r-1; j++) {
if(a[j] <= p) {
i++;
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
t = a[i+1];
a[i+1] = a[r];
a[r] = t;
return i+1;
}
我的问题是为什么我以 l-1 开头并拥有所有 i + 1 的内容?我认为只需从 l 开始就可以了。我测试下面的程序。它给出了与上面相同的结果。这比上面的要简单得多。
int L_partition2(int *a, int l, int r)
{
int i, j, p, t;
p = a[r];
i = l;
for(j = l; j <= r-1; j++) {
if(a[j] <= p) {
t = a[j];
a[j] = a[i];
a[i] = t;
i++;
}
}
t = a[i];
a[i] = a[r];
a[r] = t;
return i;
}
答案 0 :(得分:0)
您只是改变了i
的使用情况。
请注意,您在交换后递增i,因为您的交换从一开始就有效,而原始版本在交换之前递增它。但重要的是交换始终使用相同的元素(在您的版本和原始版本中)。