我正在解决以下冒泡排序算法。
但是,此算法似乎不是常见的冒泡排序实现。我已经实现了以下代码,但它会超时。原因是我的代码的时间复杂度仍为O(n ^ 2)。
如何为冒泡排序编写代码以正确理解和解决问题?
解
气泡排序是一种算法,它对长度为N的序列进行排序,以便检查两个相邻的元素以改变它们的位置。气泡分选可以执行N次,如下所示。
- 将第一个值与第二个值进行比较,如果第一个值更大,则更改位置。
- 将第二个值与第三个值进行比较,如果第二个值更大,则更改位置。
...
- 比较N-1和N的值,如果N-1值更大,则改变位置。我知道冒泡排序的结果,所以我知道冒泡排序的中间过程。然而,由于N非常大,因此执行上述步骤需要很长时间K次。编写一个程序,帮助您找到气泡排序的中间过程。
输入
N和K在第一行给出。
第二行给出第一个序列的状态。也就是说,依次给出形成第一序列的N个整数,它们之间有空格。
1 <= N <= 100,000 1 <= K <= N序列中的每个项是1至1,000,000,000的整数。
产量
上述步骤重复K次,并输出序列的状态。
命令行
Example input
4 1
62 23 32 15
Example output
23 32 15 62
我的守则
n_k = input() # 4 1
n_k_s = [int(num) for num in n_k.split()]
progression = input() # 62 23 32 15 => 23 32 15 62
progressions = [int(num) for num in progression.split()]
def bubble(n_k_s, progressions):
for i in range(0, n_k_s[1]):
for j in range(i, n_k_s[0]-1):
if (progressions[j] > progressions[j+1]):
temp = progressions[j]
progressions[j] = progressions[j+1]
progressions[j+1] = temp
for k in progressions:
print(k, end=" ")
bubble(n_k_s, progressions)
我很困惑为什么你说“原因是我的代码的时间复杂度仍然是O(n ^ 2)”
时间复杂度始终为O(n²),除非您添加一个标志来检查您的列表是否已经排序(如果列表在程序开头排序,复杂性现在为0(n))
我可以告诉你,你已经实现了所要求的算法。是O(nk); Phillippe
已经涵盖了我打字的理由。
是的,你可以设置一个标志来表明你是否在这个传球上做了任何交换。除了最佳情况之外,这并没有改变任何复杂性 - 虽然它确实在许多其他情况下减少了常数因素。
我看到加速你的过程的一个可能性是使用更有效的价值交换:使用Python成语a, b = b, a
。在您的情况下,内部循环可能会变为:
done = True
for j in range(i, n_k_s[0]-1):
if progressions[j] > progressions[j+1]:
progressions[j], progressions[j+1] = progressions[j+1], progressions[j]
done = False
if done:
break