Time complexity 如何操纵插入排序,使其始终在最糟糕的情况下运行

Time complexity 如何操纵插入排序,使其始终在最糟糕的情况下运行,time-complexity,hashcode,pseudocode,insertion-sort,Time Complexity,Hashcode,Pseudocode,Insertion Sort,我必须实现一个哈希函数,该函数将数组和索引作为参数并返回 整数。然后,我必须使用这个散列函数使插入排序始终在最坏情况下运行,即使结果数组最终没有得到排序 伪代码如下: function INSERTIONSORT(A[0..n − 1]) for i ← 1 to n − 1 do j ← i − 1 while j ≥ 0 and HASH(A, j + 1) < HASH(A, j) do SWAP(A[j + 1], A[j])

我必须实现一个哈希函数,该函数将数组和索引作为参数并返回 整数。然后,我必须使用这个散列函数使插入排序始终在最坏情况下运行,即使结果数组最终没有得到排序

伪代码如下:

function INSERTIONSORT(A[0..n − 1])
for i ← 1 to n − 1 do
     j ← i − 1
     while j ≥ 0 and HASH(A, j + 1) < HASH(A, j) do
          SWAP(A[j + 1], A[j])
          j ← j − 1
函数插入排序(A[0..n− 1])
因为我← 1至n− 我做
J← 我− 1.
而j≥ 0和散列(A,j+1)
我知道插入排序的最坏情况复杂度是O(n2),但是如果我让
散列(A,j+1)
返回一个总是小于
散列(A,j)
的整数,那么while循环将运行其最大数量的循环,这会达到O(n2)时间复杂度吗?

我想最后一个问题是“它会达到O(n2)吗?”时间复杂度?“它本身是错误的。
它显然达到了O(n2)的时间复杂度,它怎么不能呢

如果你想在最坏的情况下总是工作,除了O(n2),你基本上还想确保O(n2),也就是说,你想修正一个等于上限的下限


无论如何,答案仍然是肯定的:mading
HASH(A,j+1)
返回一个总是小于
HASH(A,j)
的整数,您可以确保内部循环总是运行
i
次。因此,对于任何执行,您都将执行精确的1+…+(n-1),这是二次(上下限)有界的。

为什么不直接使
散列(A,j)=-j
?这将使比较变成
-(j+1)<-j
,这总是正确的,因此算法将始终交换。@kaya3 OP想要“实现一个哈希函数”,而不是修改算法。@horcrux,嗯,是的,所以OP决定哈希函数做什么。类似于函数散列(A,j):return-j
将实现具有所需属性的散列函数。@kaya3抱歉,我误解了您的评论。我以为你建议在算法中用
-j
替换
散列(A,j)
。回首往事,这是毫无意义的:——)@horcrux别担心。