如何实现仅执行“K”次的冒泡排序

问题描述 投票:0回答:2

我正在解决以下冒泡排序算法。

但是,此算法似乎不是常见的冒泡排序实现。我已经实现了以下代码,但它会超时。原因是我的代码的时间复杂度仍为O(n ^ 2)。

如何为冒泡排序编写代码以正确理解和解决问题?

气泡排序是一种算法,它对长度为N的序列进行排序,以便检查两个相邻的元素以改变它们的位置。气泡分选可以执行N次,如下所示。

  1. 将第一个值与第二个值进行比较,如果第一个值更大,则更改位置。
  2. 将第二个值与第三个值进行比较,如果第二个值更大,则更改位置。

...

  1. 比较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)
python algorithm
2个回答
0
投票

我很困惑为什么你说“原因是我的代码的时间复杂度仍然是O(n ^ 2)”

时间复杂度始终为O(n²),除非您添加一个标志来检查您的列表是否已经排序(如果列表在程序开头排序,复杂性现在为0(n))


0
投票

我可以告诉你,你已经实现了所要求的算法。是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
© www.soinside.com 2019 - 2024. All rights reserved.