我正在閱讀由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;
}
書上面的算法有以下文本。
當文件中存在重複鍵時,指針交叉點是 細微。我們可以稍微改進分區過程 終止掃描,然後使用j而不是i-1, 爲第一次遞歸調用 定界左側子文件的右端。在這種情況下讓循環迭代一次就是 的改進,因爲當掃描循環以j 終止並且我指向相同的元素時,我們最終得到兩個元素: 它們的最終位置:停止的元素這兩個掃描,因此必須是 等於分區元素,並且分區 元素本身。這種改變可能是值得的,因爲在這種情況下,程序會在[r]中留下一個關鍵字等於 分區鍵的記錄,並使 中的第一個分區調用快速排序(a ,i + 1,r)退化,因爲它最右邊的鍵是其最小的 。
我的問題是
- 我們如何修改上面的程序與下面的說明?我很難修改它來理解文本。
- 爲什麼上面的快速排序算法不能有效地工作,如果有更多的重複鍵存在。
- 如果更多的重複密鑰存在,上述修改如何提高?
- 作者的意思是「他在呼叫快速排序(a,i + 1,r)中的第一個分區退化,因爲它的最右邊的鍵是最小的。」 ? 作者在這裏指的是什麼?
感謝您的時間和幫助。
@Clare Macrae:它不是功課。我自己閱讀這本書,並有上面的問題。 – venkysmarty