簡體   English   中英

無需分區功能和復雜性的快速排序,適用於最壞情況

[英]Quicksort without partition function and complexity for worst and best case

這是我的不帶分區功能的快速排序代碼,試圖找出最壞情況和最佳情況的復雜性。 你們中的任何人都可以幫助我解釋一下如何循環或逐步進行嗎?

public static void quickSort(int a[], int first, int last)
{
    int start=first,end=last;
    int mid= (first+last)/2;
    int temp;
    while(start<=end)
    {
        while(a[start]<a[mid])
        {
            start=start+1;
        }
        while(a[end]>a[mid])
        {
            end=end-1;
        }
        if(start<=end)
        {
            temp=a[start];
            a[start]=a[end];
            a[end]=temp;
            start++;
            end--;
        }
    }
    if(first<end)
    {
        quickSort(a,first,end);
    }
    if(start<last)
    {
        quickSort(a,start,last);
    }
}

您的實現是正確的。 外部while循環對整個數組進行一次迭代,因此它具有線性時間復雜度。 對於內部while循環的整個迭代,兩個內部循環都只在數組的每個元素中運行一次,因此,外部while循環的整體時間復雜度為O(n)。

對快速排序函數的調用與標准函數中的調用相同,只是將它們與分區一起放在了同一函數中。

因此,代碼的總體時間復雜度與標准快速排序算法相同(平均情況下為O(nlogn),最壞情況下為O(n2))。

空運行樣品陣列

考慮數組1,7,8,9,6,4,5,2,3,10現在first = start = 0,last = end = 9,mid = 4

Iteration1:由於start <= end,我們先進入while循環,然后我們將start遞增直到小於中間元素。 因為a [mid] = 6,所以我們可以從1開始遞增,因為下一個元素是大於6的7,然后退出第一個內部循環。 現在我們對第二個內部循環重復相同的過程,因為3小於6,所以將end減少1,然后退出第二個內部循環。 現在我們交換7和3並增加開始和減少結束。

新數組:1,3,8,9,6,4,5,2,7,10

Iteration2:開始指向8,結束指向2,因為start大於中間元素,而end小於中間元素,因此我們不進入內部循環並交換start和end。 增加開始和減少結束。

新數組:1,3,2,9,6,4,5,8,7,10

Iteration3:因為start大於中間元素且end小於中間元素,所以開始指向9並指向5結束,因此我們不進入內部循環並交換start和end。 增加開始和減少結束。

新數組:1,3,2,5,6,4,9,8,7,10

Iteration4:因為開始點大於中間元素且結束點小於中間元素,所以開始指向6,結束點指向4,因此我們不進入內部循環並交換開始和結束。 增加開始和減少結束。

新數組:1,3,2,5,4,6,9,8,7,10

迭代5:因為開始大於結束,所以開始指向6,結束指向4,因此我們在這里退出。

現在您可以看到我們迭代了外部循環5次,但對於內部循環,我們僅迭代了1次,每次小於n(= 10)。

現在,自己動手運行此陣列,以更好地了解它。 1,2,3,4,6,5,7,8,9,10。

暫無
暫無

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

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