我正试图从火车上的记忆中编写一个冒泡排序,以便今天早上开始工作,但是我提出了这个建议。
这种类型的名称吗?
def not_bubble_sort(arr):
length = len(arr)
while True:
is_sorted = True
for i in range(length - 1):
if arr[i] > arr[i + 1]:
is_sorted = False
arr[i], arr[i + 1] = arr[i + 1], arr[i]
if is_sorted:
break
return arr
对于某些数据,我希望它效率极低。但是对于其他随机生成的列表,它的速度非常快,有人可以解释为什么。有没有办法利用它?还是我在某个地方犯了错误。
我针对实际的气泡排序运行了一些基准测试,发现对于某些类型的随机生成的列表而言,这要快得多。
基准测试对生成的n个randint
整数列表进行排序。
N = 5000
------
| min | avg | max | func | name |
|---------------|---------------|---------------|-------------------|-------------------|
| 0.000463724 | 0.034745610 | 3.425408840 | not_bubble_sort | sarcoma |
| 1.159517288 | 1.212791989 | 1.768434763 | bubble_sort | geeks_for_geeks |
怪胎怪胎示例冒泡排序:
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
https://github.com/sarcoma/algorithms-python/blob/master/algorithms/sort/bubble_sort.py
答案 0 :(得分:4)
这只是气泡排序,但提前退出。
在“真实”气泡排序中,无论数据是什么样,您都要遍历数组length-1
次,但是在这里,如果在较早的步骤中对数据进行了排序,则您break
。
效率低下是因为您的算法的复杂度为“ O(n ^ 2)”,而不是“ O(1/2 * n ^ 2)” *(因为此for i in range(length - 1):
而不是此{{ 1}})
*不是真正的大O表示法,但证明了这一点