我正在解决以下气泡排序算法。
但是,该算法似乎不是常见的冒泡排序实现。我已经实现了以下代码,但是会超时。原因是我的代码的时间复杂度仍然是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)
答案 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