羅伯特塞迪威克算法書中快速排序部分的文字。使用三位羅伯特塞德威克中位數的快速排序改進
通過從數組的左邊,中間和右邊選擇三個元素,我們可以將標記合併到這個方案中。對三個元素進行排序,然後在中間與a[r-1]
進行交換,然後在a[l+1],...,a[r-2]
上運行分區算法。這種改進稱爲三種方法的中位數。
三種方法的中位數有助於以三種方式快速排序。
這使最壞的情況在任何實際的排序中都不太可能發生。對於需要執行
O(N^2)
時間的排序,所檢查的三個元素中的兩個元素必須位於文件中最大元素或最小元素之間,並且此事件必須始終貫穿大部分分區。它消除了用於分區的標記鍵的必要性,因爲此功能由分區之前檢查的三個元素之一提供。
它將算法的總平均運行時間減少了大約5%。
template <class Item> void exch(Item &A, Item &B) { Item t = A; A = B; B = t; } template <class Item> void compexch(Item &A, Item &B) { if (B < A) exch(A, B); } static const int M = 10; template <class Item> void quicksort(Item a[], int l, int r) { if (r-l <= M) return; exch(a[(l+r)/2], a[r-1]); // line 1 compexch(a[l], a[r-1]); // line 2. compexch(a[l], a[r]); // line 3. compexch(a[r-1], a[r]); // line 4. int i = partition(a, l+1, r-1); quicksort(a, l, i-1); quicksort(a, i+1, r); } template <class Item> void hybridsort(Item a[], int l, int r) { quicksort(a, l, r); insertion(a, l, r); }
我上面的文字問題,可以在任何一個簡單的例子來解釋
什麼是筆者的「最壞的情況下更不可能在任何實際的排序發生的意思。對於按照N平方時間排序,所檢查的三個要素中的兩個必須是最大的「?
作者的意思是「它消除了對分區進行定位密鑰的必要性」?
在上面的程序中,我們在上面的代碼中評論的第1,2,3和4行中實現了什麼?
感謝您的時間和幫助!
例如「它消除了對分區進行定位密鑰的必要性」的一部分,你不明白嗎?不知道分區是什麼?不知道哨兵鑰匙是什麼?不知道「消除」是什麼意思?理解句子,但不明白爲什麼這是真的?對於所有三個問題,我認爲你需要明確你的理解。 –