[英]Sorting for the heck of it — Quicksort
我們必須為自己的Comparable基類制作一個優化的快速排序。 對於我的生活,我無法使它成功。 該算法似乎很簡單,但我無法看到讓我的代碼工作。 我有一個DateTime類,它擴展了我用來測試的Comparable,並且排序似乎有效,但是每20個左右一個運行單個值是不合適的,當我在數組的塊上使用插入排序時超過8,整個類型被拋出了重擊。
在我的分區方法中,當我將樞軸移動到結束並在開始和結束時啟動我的指針時,它有用 - 1.我想將樞軸移動到結束 - 1因為第一個和最后一個已經排序並啟動指針在第一個+ 1和結束-2但是如果我嘗試這一切並且我不明白為什么,一切都會崩潰。
所以我現在有一些功能。 當我不在較小的子陣列上使用插入排序時,它會有點痙攣,這些陣列很困難,但最終會弄清楚。 感謝ben j指出有關數組掉線的問題......這導致了插入排序問題。 :)
我目前的代碼如下
Comparable** partition(Comparable** from, Comparable** to)
{
Comparable** pivot = from + (to - from) / 2;
SortFirstMiddleLast(from, pivot, to - 1);
swap(*pivot, *to);
pivot = to;
++from; to -= 2;
while (from <= to)
{
while (**from <= **pivot && from <= to) ++from;
while (**to >= **pivot && from <= to) --to;
if (from < to)
{
swap(*from, *to);
++from; --to;
}
}
swap(*from, *pivot);
return from;
}
從你告訴我們,你的什么去評論的代碼錯誤我唯一的猜測是, from
和to
並不意味着你的想法。 您的代碼必須to - from
作為要排序的段的長度。 如果這是確切的(而不是為支點的選擇只是近似值),這將意味着, to
在一個元素實際上是指向剛剛超越區域進行排序。 這是合理的,但是然后swap<Comparable*>(*pivot, *(to))
會將數據庫交換到列表末尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.