簡體   English   中英

為它排序 - 快速排序

[英]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;
}

從你告訴我們,你的什么去評論的代碼錯誤我唯一的猜測是, fromto並不意味着你的想法。 您的代碼必須to - from作為要排序的段的長度。 如果這是確切的(而不是為支點的選擇只是近似值),這將意味着, to在一個元素實際上是指向剛剛超越區域進行排序。 這是合理的,但是然后swap<Comparable*>(*pivot, *(to))會將數據庫交換到列表末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM