这是实施冒泡排序的正确方法吗? 我得到一个排序列表,但我怀疑该方法是否正确。
# Input unsorted list
size_lis = int(input("enter the size of the list"))
size = 0
list1 = list()
while (size < size_lis):
element = int(input("enter the element"))
list1.append(element)
size += 1
# Sort
for i in range(0, len(list1)):
for j in range(0, len(list1)-1):
if list1[j] > list1[j+1]:
list1[j],list1[j+1] = list1[j+1],list1[j]
print(list1)
答案 0 :(得分:1)
这是冒泡排序算法的正确实现。但是你可以使用这种实现来防止额外的循环:
def bubble_sort(arr):
for i in range(len(arr))[::-1]:
for j in range(1, i + 1):
if arr[j - 1] > arr[j]:
arr[j], arr[j-1] = arr[j-1], arr[j]
第一个循环以相反的顺序迭代range(len(arr))
([::-1]
- 以最有效的方式反转列表的操作)。在此循环的第一次迭代之后,列表中的最大元素将放在列表的末尾。而第二个循环只需要通过剩余的元素进行迭代。
我在1000个元素上使用两个相同的数组测试了你的(bubble_sort_2
)和我的(bubble_sort
)实现。
以下是结果(使用 cProfile ):
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.215 0.215 0.215 0.215 bs.py:22(bubble_sort_2)
1 0.128 0.128 0.128 0.128 bs.py:16(bubble_sort)
如您所见,bubble_sort
比bubble_sort_2
快。
答案 1 :(得分:1)
在冒泡排序中,最大的元素一步一步地移动到列表的末尾。因此,在第一次通过后,这一个元素处于其最终位置。第二遍应该只对N-1个剩余元素进行排序等。
在发布的代码中,只需像这样调整内圈。这将节省近50%的CPU时间。
n = len(lst)
for i in range(n):
for j in range(n-i-1):
if lst[j] > lst[j+1]:
lst[j], lst[j+1] = lst[j+1],lst[j]