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

时间:2019-04-17 15:37:59

标签: python algorithm

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

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

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

解决方案

  

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

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

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

  4.   
     

...

     
      
  1. 比较第N-1个和第N个值,如果第N-1个值较大,则更改位置。   我知道气泡排序的结果,所以我知道气泡排序的中间过程。但是,由于N非常大,因此需要花费很长时间来执行上述步骤K次。编写一个程序,以帮助您找到气泡排序的中间过程。
  2.   

输入

  

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)

2 个答案:

答案 0 :(得分:0)

对于您为什么说“原因是我的代码的时间复杂度仍然为O(n ^ 2)”,我感到困惑

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

答案 1 :(得分: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