Java 无分区函数的快速排序和最坏和最佳情况的复杂性
这是我在没有分区函数的情况下快速排序的代码,我试图找出最坏和最好情况的复杂性。你们谁能帮我解释一下它是如何一个循环一个循环或者一步一步地工作的Java 无分区函数的快速排序和最坏和最佳情况的复杂性,java,algorithm,sorting,time-complexity,Java,Algorithm,Sorting,Time Complexity,这是我在没有分区函数的情况下快速排序的代码,我试图找出最坏和最好情况的复杂性。你们谁能帮我解释一下它是如何一个循环一个循环或者一步一步地工作的 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
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);
}
}
公共静态void快速排序(int a[],int first,int last)
{
int开始=第一个,结束=最后一个;
int mid=(第一个+最后一个)/2;
内部温度;
while(start您的实现是正确的。外部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
迭代1:
由于start您的实现是正确的。外部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
迭代1:
因为startIt和分区函数是一样的。你仍然在分区,只是你在一个函数中做所有的工作,而不是有一个专门的分区函数。嗯。你能解释一下怎么做吗。我可以看到O(n/2)对于这两个快速排序函数,无法计算出rest语句。有人吗?时间为t(n/2)对于这两个快速排序函数,如何计算和近似其余部分?我的实现正确吗?这与分区函数相同。你仍然在分区,只是你在一个函数中完成所有工作,而不是有一个专用的分区函数。嗯。你能解释一下如何进行吗。我可以看到O(n/2)对于这两个快速排序函数,我无法计算出rest语句。有人吗?对于这两个快速排序函数,时间都是t(n/2),如何计算和近似rest?我的实现是否正确?但我仍然不知道如何计算内部复杂度。我的概念一直是这样的:外部循环(n次)内部while回路(n/2)每次都是次。因此n/2+n/2=n,然后是乘法n^2。我知道我在这里错了,所以需要更正我的理解我是否错过了你的评论?我取了任何数组5,4,3,2,1,当开始和结束都在3,即中间位置时,它似乎失败了。你的答案是,你从来没有进入任何while循环,总是进入每个if循环1 t外部循环执行的ime。这使得它有5次,现在如何继续。我知道我很差,但尝试学习我在第一次迭代中只使用了两个内部循环一次。你可以自己在纸上运行这段代码并进行检查,这相当容易。但我仍然不知道如何计算内部部分的复杂性。我的概念一直是这样:外循环(n次)内循环(n/2)每次都是次。因此n/2+n/2=n,然后是乘法n^2。我知道我在这里错了,所以需要更正我的理解我是否错过了你的评论?我取了任何数组5,4,3,2,1,当开始和结束都在3,即中间位置时,它似乎失败了。你的答案是,你从来没有进入任何while循环,总是进入每个if循环1 t外循环执行的ime。这使得它有5次,现在如何继续。我知道我很差,但尝试学习我在第一次迭代中只进入了两个内循环一次。你可以自己在纸上运行这段代码并检查,这相当简单。