簡體   English   中英

如何使樞軸元素在Quicksort中通用?

[英]How to make pivot element generic inside Quicksort?

我正在嘗試使用quicksort對文件中存在的100k個元素進行排序,僅當我將第一個元素用作數據透視時,算法才起作用。如何使數據透視元素對程序通用?使用quicksort選擇數據透視元素的最佳方法是什么?樞軸元素是否取決於數據,或者我們是否實時使用任何特定算法?

void quicksort(int *temp,int p,int r)
{
    if(r > p + 1)
    {
        int piv = temp[p];
        int left = p + 1;
        int right = r;
        while(left < right)
        {
            if(temp[left] <= piv)
                left++;
            else
                swap(&temp[left], &temp[--right]);
        }
        swap(&temp[--left], &temp[p]);
        quicksort(temp, p, left);
        quicksort(temp, right, r);
    }
}

樞軸選擇的限制是它必須相當快。 常見的方法是選擇第一個元素,選擇中間元素或選擇隨機元素。

使用隨機元素可能是最好的方法,因為即使對於已排序的列表,它仍然傾向於快速排序(使用第一個元素在排序后的列表上的效果會很差,因為以下所有元素都將落在數據透視表的一側)。

除非您的列表以某種奇怪的非標准順序使用,例如使用串聯兩個以相反順序排序的列表即可找到中間元素,否則使用中間元素也是相當安全的。

我建議隨機選擇。

僅當我將第一個元素用作樞軸時,算法才能工作

當您說這句話時,如果您的支點不是第一個元素,這是否意味着它會產生排序錯誤的列表? 您能否詳細介紹?

暫無
暫無

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

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