簡體   English   中英

使用Quicksort C ++對數組進行排序

[英]Sorting arrays with Quicksort C++

我正在(學校)項目中工作,其中一項要求是對數組進行排序。 因此,我決定使用quicksort。 (我之所以選擇它,是因為它是一種我現在不知道的算法),我設法理解了它的工作原理,並且還找到了在c ++中實現它的選擇。

void quicksort(size_t v[], size_t start_pos, size_t end_pos)
{
    size_t i, j, di, dj;
    if (start_pos < end_pos)
    {
        i = start_pos, j = end_pos;
        di = 0, dj = 1;
        do
        {
            while (i < j && (v[j] > v[i] || v[j] == v[i])) i += di, j -= dj;
            if (i < j)
                std::swap(v[i], v[j]), di = (di + 1) % 2, dj = (dj + 1) % 2;
        } while (i < j);
        if (i - start_pos > 1)
            sort(v, start_pos, i - 1);
        if (end_pos - i > 1)
            sort(v, i + 1, end_pos);
    }
}

我不明白的是...如果在最后2個語句中使用“> 1”,為什么呢? 我希望有人可以為我澄清這一點。 謝謝! :)

兩種計算都分別提供了左和右細分的大小。

如果大小為1或零,則說明該部分已經排序,不需要任何進一步的處理。

    if (i - start_pos > 1)  
        sort(v, start_pos, i - 1);  

僅當范圍是兩個或更多元素時才進行排序調用。 正如Barry所指出的,這可能應該是

    if (i - start_pos > 1)  
        quicksort(v, start_pos, i - 1);        

維克多斯的評論也很重要。

如果仔細看,代碼的上半部分將安排與樞軸元素相對應的數組,該元素在i處索引,最后兩個if對其余部分(即樞軸元素的左右)進行排序,但是如果您的樞軸索引已經到達end_pos,您不需要在數據透視元素的右邊對元素進行排序,因此存在一個條件是否i <end_pos。

暫無
暫無

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

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