簡體   English   中英

計算氣泡數和比較中的比較次數時出現問題

[英]Problems counting number of exchanges and comparisons in bubble sort

我知道反向排序的列表應該產生比較的theta(n ^ 2)個數和冒泡排序交換的theta(n ^ 2)個數。 在我的示例代碼中,我使用的是大小為n = 10的列表。我為numComparisons和numExchanges實現了計數器,盡管這看起來並不復雜,但是我無法弄清楚為什么我的結果不能產生100次比較,並且100次交流。 我真的離目標很遠嗎?

void testList::bubbleSort()
{

    int k = 10;
    bool flag = true;

    while(flag)
    {
        k = k - 1;
        flag = false;

        for(int j = 0; j < k; j++)
        {
            if( vecPtr[j] > vecPtr[j+1])
            {   


                int temp = vecPtr[j];
                vecPtr[j] = vecPtr[j+1];
                vecPtr[j+1] = temp;
                numExchanges += 1;
                flag = true;
            }
            numComparisons++;
        }
    }
}

結果輸出:

原始列表: 10 9 8 7 6 5 4 3 2 1

排序列表: 1 2 3 4 5 6 7 8 9 10

比較: 45

交流次數: 45

我也嘗試了此實現,但結果卻是相同的:

void testList::bubbleSort()
{

    int temp;
    for(long i = 0; i < 10; i++)
    {
        for(long j = 0; j < 10-i-1; j++)
        {
            if (vecPtr[j] > vecPtr[j+1])
            {
                temp        = vecPtr[j];
                vecPtr[j]     = vecPtr[j+1];
                vecPtr[j+1]   = temp;
                numExchanges++;
            }
            numComparisons++;
        }
    }
}

大約需要進行N 2/2比較和交換。

特別是,內循環開始外循環的當前值。 因此,在第一次迭代中,它將遍歷整個數組。 在每個后續迭代中,它遍歷數組中少一個的項目。

因此,內部循環的迭代次數為N + N-1 + N-2 ... 1.平均而言,大約為N / 2。

如果要提高精度,還需要考慮更多細節:內部循環從i + 1 ... N進行迭代,因此其最大值是N-1次迭代,而不是N次迭代。

因此,而不是精確的N 2/2,這真是N *(N-1)/ 2。 您的情況是10 * 9/2 = 45。

這就是比較次數的計數。 對於掉期,您會得到一些百分比,具體取決於亂序的項目數。 在您的特定情況下,所有項目總是亂序(因為您是從逆序開始的),因此您需要為每個比較進行交換。 使用其他任何訂購,您都希望減少交換次數。

45 = 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 +1,所以對於交易所來說,這是正確的,但是對於比較,我認為在某處一定有一個錯誤。 編輯:您實現了比標准冒泡排序稍微智能的版本,這就是為什么只有45個比較而不是90個比較的原因(不是100個,一次迭代需要9個比較)。

暫無
暫無

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

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