【发布时间】:2013-09-24 05:01:09
【问题描述】:
第一个很简单,从两边走,直到找到一个回归。
/*C++ version, [first, last), last needs --first to fetch the last element*/
/*returns the middle of partitioning result*/
int* partition( int *first, int *last, int pivot ) {
while (true) {
while (*first < pivot) ++first;
--last;//Don't edit this, it's true.
while (pivot < *last) --last;
if (!(first < last)) return first;
swap(*first, *last);
++first;
}
}
第二个(见“算法简介”)是:
int* partition( int a[], int n, int pivot ) {
bound = 0;
for ( i = 1; i != n; ++i )
if ( a[i] < pivot )
swap( &a[i], &a[++bound]);
swap(a, a + bound);
return a + bound;
}
第二个的不变量是“All elements before bound is less than pivot”。
问:两个版本的优缺点是什么?
我先给出一个,第二个需要对迭代器(指针)进行++操作,所以它可以应用于一些ForwardIterator,比如链表的迭代器。其他提示?
【问题讨论】:
-
第一个真的是对的吗,是不是第三行的
--last放错地方了? -
@Joni 不,这是一个 c++ 版本,其中 last 是一个遍历最后一个元素的迭代器。
-
在这种情况下,我建议给出完整的实现,包括函数定义和
first、last和pivot的声明,以及函数应该返回的规范 (第一个有return语句,第二个没有) -
第一个是用于查找位于枢轴槽错误(相反)侧的两个元素并交换它们的常用算法。第二个旨在选择枢轴槽最终的位置,逐步调整它并在此过程中将所有小于枢轴值的值移动到其下方。在这两者中,第二个通常更容易被初学者理解,并且不太容易出现错误的实现。第二个可以触发更多的交换,但两者具有相似的复杂性。
-
@Joni 很好,完成了。抱歉我的含糊陈述。
标签: c++ c algorithm quicksort partition