【发布时间】:2012-11-12 06:27:27
【问题描述】:
我正在阅读 Robert Sedwick 所著的《算法和数据结构》第 1-4 部分书中的快速排序算法。
template <class item>
static void quicksort(item [] a, int l, int r)
{
if(r <= l) return;
int i = partition(a,l,r);
quicksort(a, l, i-1);
quicksort(a, i+1, r);
}
template <class item>
int partition(item a[], int l, int r)
{
int i = l-1; j = r; item v = a[r];
for(;;) {
while( a[++i] < v );
while( v < a[--j] )
if( j == l )
break;
if( i >= j)
break; // pointer crossing.
exch(a[i], a[j]);
}
exch(a[i], a[r]);
return i;
}
本书有以下关于上述算法的文字。
当文件中存在重复键时,指针交叉是 微妙的。我们可以通过以下方式稍微改进分区过程 当 i
我的问题是
- 我们如何修改上面的程序,描述如下?我很难修改它以理解文本。
- 如果存在更多重复键,为什么上述快速排序算法无法有效工作。
- 如果存在更多重复键,上述修改将如何改进?
- 作者所说的“他在调用快速排序(a, i+1, r) 中的第一个分区退化,因为它最右边的键是它的最小键”是什么意思。 ?做什么 作者在这里指的是退化?
感谢您的时间和帮助。
【问题讨论】:
-
@Clare Macrae:这不是家庭作业。我正在自读这本书,上面有一个问题。