[英]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.