Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用快速排序对数组进行分区的运行时分析_Java_Algorithm_Runtime_Time Complexity_Quicksort - Fatal编程技术网

Java 使用快速排序对数组进行分区的运行时分析

Java 使用快速排序对数组进行分区的运行时分析,java,algorithm,runtime,time-complexity,quicksort,Java,Algorithm,Runtime,Time Complexity,Quicksort,我正在为学校写一篇关于快速排序的研究论文,因此我必须对我的算法的最佳和最坏情况进行精确的运行时分析,但我在为while语句的部分内容而挣扎。我理解为什么它是log(n),因为你有这么多的递归调用,你有n/2^k=1,这个方程给你n=2^k,k=log2(n)等等。。。既然我理解了递归调用,这一部分其实并不重要,但重要的是我的以下代码: } } 我必须根据元素n为每个语句指定“成本”。 因此,我为每个if语句添加了+1,因为它们是简单语句,现在我不知道如何获得while循

我正在为学校写一篇关于快速排序的研究论文,因此我必须对我的算法的最佳和最坏情况进行精确的运行时分析,但我在为while语句的部分内容而挣扎。我理解为什么它是log(n),因为你有这么多的递归调用,你有n/2^k=1,这个方程给你n=2^k,k=log2(n)等等。。。既然我理解了递归调用,这一部分其实并不重要,但重要的是我的以下代码:

   }

        }
我必须根据元素n为每个语句指定“成本”。 因此,我为每个if语句添加了+1,因为它们是简单语句,现在我不知道如何获得while循环的成本。外部循环一直运行,直到指针i和j交叉,因此外部循环至少执行n/2+1(+1表示退出条件)-但我无法确定内部两个while循环运行的频率。我原以为它们也会运行n/2次,但这行不通,因为我们的老师告诉我们,每当我们有嵌套语句时,我们必须乘以成本,这将导致(n/2+1)*((n/2)+1)+((n/2)+1)),这显然是n^2而不是O(n)。。。 是的,我必须为每个中止条件加上一个+1,如果语句,尽管它们并不重要。。。 我希望你能帮助我,告诉我我得到一个O(n^2)运行时的错误是什么,尽管它必须是O(n)

旁注:我认为暂时来说,最好或最坏的情况都无关紧要,所以不要介意

提前谢谢
ChampSilver

最坏情况下运行时间为O(n)的原因是,如果仔细查看代码,就会发现每个数组索引最多访问一次: 请注意,索引
i
只会随着大小而增加,而索引
j
只会减少,因此每个索引最多只能查看一次

例如,如果有一个大小为10的数组
a[]
,则初始索引
i
将为0,
j
将为9
x
将(随机)介于两者之间,比如说
x=4
。 然后,外部while循环进入,第一个内部while循环增加索引
i
,直到
a[i]>=a[x]
。 第二个内部while循环对索引
j
(相反方向)执行相同的操作

但两个内循环的总迭代次数之和最多为10次。此时,下一个外部while循环检查将返回false,并且不会发生第二次迭代。

让我们从以下内容开始:

我们的老师告诉我们,当我们有嵌套语句时,我们必须乘以成本,这将导致(n/2+1)*((n/2)+1)+((n/2)+1)),这显然是n^2,而不是O(n)


只有当内部循环和外部循环中的循环变量彼此独立时,才是如此

例如

这是因为,对于
i
的每个值,内部循环都会对
j
的所有值进行迭代。这就是O(n^2)。现在,让我们看另一个例子:

for i in range(1..10):
    for i in range(1..10):
        do something
在这种情况下,外部循环只运行一次,因为当内部循环退出时,外部循环的条件也停止。这就是,O(n)

现在,让我们看看您的
while循环

外部条件是当i小于j时。在内部,我们总是增加
i
,减少
j
。因此,在这种情况下,执行
语句的总次数(全部3次)将是
i+j
的上限,即
2n
。因此,复杂性是
O(2n)
或者,
O(n)

编辑:

我做这个编辑是为了解释“复杂性”实际上意味着什么


这是一种近似/计算总迭代次数的方法,随着输入大小的增加,所有循环和指令组合在一起。因此,如果您真的想知道这一点,只需指定一个变量,比如
a
,然后将1添加到
a
,作为每个循环的第一行。然后针对不同的输入大小打印
a
,您将知道
O()
符号在理论上与实践上的含义。

“只有当内部循环和外部循环中的循环变量彼此独立时,这才是正确的。”感谢您的澄清。。我真的很困惑。。。关于循环,我可以说外部循环运行n次,内部循环运行n/2次,也就是2n,在这种情况下,它的最佳或最坏情况是否重要,或者分区总是需要2n时间?这些wile循环的上限是2n,这意味着,它们在任何情况下都不会运行超过2n。可能有一些情况下,它们的运行小于2n,虽然这并不重要,因为复杂性仍然被称为O(n)。非常感谢您的努力,但我仍然不明白为什么上界是2n,因为我,如果我们有最好的情况,我也只会一直运行到n/2和j,所以它应该是n而不是2n,不是吗?请看这行:“while语句(全部3个)执行的总次数将是i+j上的上限”。它不是内部while循环运行的总次数。因此,上限为
n
for i in range(1..10):
    for i in range(1..10):
        do something