【问题标题】:Is this Bubble sort logic correct这个冒泡排序逻辑是否正确
【发布时间】:2020-11-20 16:38:18
【问题描述】:

我在 youtube 上看到了一些关于列表排序技术、冒泡排序和他们使用的代码的视频

list1 = [4, 8, 5, 3, 1]

for i in range(len(list1)-1, 0, -1):
    for j in range(i):
        if list1[j] > list1[j+1]:
            t = list1[j]
            list1[j] = list1[j+1]
            list1[j+1] = t
print(list1)

在没有 python 的情况下我自己获取不同的列表并对其进行排序后,我发现了一个模式,并对代码进行了轻微的安排,我得到了相同的输出。

list1 = [4, 8, 5, 3, 1]

for i in range(1,len(list1)):
    for j in range(len(list1)-1):
        if list1[j] > list1[j+1]:
            t = list1[j]
            list1[j] = list1[j+1]
            list1[j+1] = t

print(list1)

但是在这里,我只想知道逻辑是否相同,方法也是冒泡排序因为将来当要求我进行冒泡排序时,我不想这样做并最终感到尴尬:p

提前致谢:D

【问题讨论】:

  • 一个从右到左迭代,另一个从左到右迭代。它们都是冒泡排序,只是镜像
  • @MitchelPaulin 从右到左和从左到右是否与升序或降序有关?
  • 不是,那要看你if语句里有>还是<
  • @MitchelPaulin 他们没有被镜像。它们以完全相同的顺序执行完全相同的交换。
  • @MarkRansom 那不是做实际工作的人。这只是提供了一个限制或内部循环完成的次数。

标签: python python-3.x list bubble-sort


【解决方案1】:

算法是冒泡排序,但有不必要的比较。您通过对所有 n 个元素进行 n 次迭代对其进行排序。但是在第一次之后可以保证,最高值在最后一个位置,所以下一步只需要遍历前n-1个元素,以此类推。在您的算法中,您只需继续到最后。这并没有错,但效率不高。但是它不会改变 O(n^2) 的时间复杂度。

编辑: 回复一些 cmets:是的,一般来说,您不会使用冒泡排序来提高效率。但是有一种情况,它表现得非常好(优化在一次迭代没有变化时停止),那就是如果你有一个几乎排序的列表。

【讨论】:

  • 第二个版本允许优化(未显示),当您通过没有交换时,您已经完成并且可以提前退出。
  • @MarkRansom 你是说我的版本吗?
  • @MarkRansom 你是对的,但你也可以在第一个版本中做同样的优化。
  • @CoolCloud Quicksort 通常被认为是最快的,不是因为它有最好的 big-O,而是因为常数因子较少——在最坏的情况下它可能非常慢。 Python 本身使用 Timsort。
  • @CoolCloud O(n log(n)) 意味着该算法只需要 n log(n) 步骤(乘以一个常数在限制中,其中 n 是问题的大小。例如对于 n =10000(10000项的列表),cn log(n)比cn^2小很多,即使c比较大。所以算法要快得多。en.wikipedia.org/wiki/Big_O_notation
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
相关资源
最近更新 更多