这是我的代码 - 用于按asc顺序对列表元素进行排序的冒泡排序算法:
foo = [7, 0, 3, 4, -1]
cnt = 0
for i in foo:
for i in range(len(foo)-1):
if foo[cnt] > foo[cnt + 1]:
temp = foo[cnt]
c[cnt] = c[cnt + 1]
c[cnt + 1] = temp
cnt = cnt + 1
cnt = 0
我一直在修改我的代码,但对于在线评判来说,它仍然效率太低。一些帮助将不胜感激!
Early Exit BubbleSort
count
摆脱enumerate
a, b = b, a
。changed
背后的直觉。i
元素将被排序,因此您可以进一步减少与算法相关的常数因子。foo = [7, 0, 3, 4, -1]
for i in range(len(foo)):
changed = False
for j, x in enumerate(foo[:-i-1]):
if x > foo[j + 1]:
foo[j], foo[j + 1] = foo[j + 1], foo[j]
changed = True
if not changed:
break
print(foo)
[-1, 0, 3, 4, 7]
请注意,这些优化都不会改变冒泡排序(仍为qazxsw poi)的渐近(Big-O)复杂度,相反,只会减少相关的常数因子。
一个简单的优化是从i + 1索引开始第二个循环:
O(N ** 2)
由于您已经将所有内容排序到索引i,因此无需再次迭代它。这可以为您节省超过50%的比较 - 在这种情况下,它在原始算法中为10比25。
为了理解算法在独立于计算机体系结构或时钟速率的计算资源使用方面的效率,您需要了解大哦符号。它基本上可以帮助您分析算法的最坏情况运行时间或内存使用情况,因为输入的大小会增加。总之,算法的运行时间将属于以下类别之一(从最快到最慢);
O(1):恒定时间。发音(Oh of 1)。最快的时间。
O(lg n):对数时间。发音(日志的哦)。比线性时间更快。传统上,它是搜索的最快时间。
O(n):线性时间。发音(哦,n,n是输入的大小,例如数组的大小)。通常需要检查输入的每一位。
O(nlgn):在元素列表上执行排序时我们当前可以实现的最快时间。
O(n ** 2):n平方的哦。二次时间。当我们有嵌套循环时,这通常是绑定。
O(2 ** n):真的,非常棒!提升到n的幂的数字比提高到任何幂的n慢。
在您的情况下,您使用的是嵌套循环,即O(n2)。我编写的代码使用单个while循环,其增长复杂度为O(n),比O(n2)快。我没有真正尝试过一个非常大的for i in range(0, len(foo)):
for j in range(i+1, len(foo)):
if (foo[i] > foo[j]):
temp = foo[i]
foo[i] = foo[j]
foo[j] = temp
,但在你的情况下它似乎工作。尝试一下,让我知道它是否按预期工作。
array
注意:在示例列表(k)中,我们只需要遍历列表三次,以便按升序排序。因此,如果你将while循环更改为这行代码k = [7, 0, 3, 4, -1]
n = len(k)
i = 0
count = 0
while count < n**2: # assuming we wouldn't go through the loop more than n squared times
if i == n - 1:
i = 0
count += 1
swapped = False
elif k[i] > k[i+1]:
temp = k[i]
k[i] = k[i+1]
k[i+1] = temp
i+=1
swapped = True
elif swapped == False:
i += 1
elif swapped == True and i < n - 1:
i += 1
,它仍然可以工作。