这是我的快速排序代码,没有分区功能,并试图找出最坏和最好情况的复杂性。你们中的任何人都可以帮我解释一下它如何循环或一步一步地工作吗?
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);
}
}
答案 0 :(得分:0)
您的实施是正确的。外部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&lt; = end开始,我们首先进入while循环 现在我们开始递增,直到它小于中间元素。 因为a [mid] = 6所以我们可以从1开始递增,因为下一个元素是7,大于6并退出第一个内循环。 现在我们用第二个内循环重复相同的过程 我们将结尾减少1,因为3小于6并退出第二内循环。 现在我们交换7和3并增加开始和结束。
新阵列:1,3,8,9,6,4,5,2,7,10
迭代2: 开始指向8并指向2结束 因为start大于middle元素而end小于middle元素所以我们不进入内部循环并交换start和end。 增加开始和减少结束。
新数组:1,3,2,9,6,4,5,8,7,10
Iteration3: 开始指向9并指向5结束 因为start大于middle元素而end小于middle元素所以我们不进入内部循环并交换start和end。 增加开始和减少结束。
新阵列:1,3,2,5,6,4,9,8,7,10
Iteration4: 开始指向6并指向4结束 因为start大于middle元素而end小于middle元素所以我们不进入内部循环并交换start和end。 增加开始和减少结束。
新数组:1,3,2,5,4,6,9,8,7,10
Iteration5: 开始指向6并指向4结束 因为开始大于结束所以我们退出这里。
现在你可以看到我们遍历外循环5次但是对于内循环我们只迭代了1次,每次小于n(= 10)。
现在自己干这个阵列以更好地理解它。 1,2,3,4,6,5,7,8,9,10。