📅  最后修改于: 2020-10-29 01:07:56             🧑  作者: Mango
在各种排序算法中,冒泡排序是一种简单的算法。我们将其作为第一个排序算法进行学习。它易于学习且高度直观。它可以很容易地实现到代码中,这对初学者软件开发人员非常有益。但这是对每个元素进行排序的最差算法,因为它会在每次对数组进行排序或不排序时进行检查。
让我们了解气泡排序的概念。
冒泡排序使用简单明了的逻辑,即如果相邻元素的排列顺序不正确,则会重复交换它们。它一次比较一对,如果第一个元素大于第二个元素,则交换。否则,请移至下一对元素进行比较。
让我们通过一个例子来理解它-
范例-
我们正在创建一个元素列表,其中存储了整数
list1 = [5、3、8、6、7、2]
在这里,算法对元素进行排序-
第一次迭代
它比较前两个元素,这里5> 3然后相互交换。现在我们得到新列表是-
[3、5、8、6、7、2]
在第二个比较中,5 <8然后发生交换-
[3、5、8、6、7、2]
在第三个比较中,8> 6然后交换-
[3、5、6、8、7、2]
在第四次比较中,8> 7然后交换-
[3、5、6、7、8、2]
在第五次比较中,8> 2然后交换-
[3,5,6,7,2,8]
第一次迭代到此完成,最后得到最大的元素。现在我们需要len(list1)-1
第二次迭代
第三次迭代
它将迭代直到列表被排序。
第四次迭代-
第五次迭代
检查每个元素,我们可以看到我们的列表是使用冒泡排序技术排序的。
我们已经描述了气泡排序技术。现在,我们将在Python代码中实现逻辑。
程序
# Creating a bubble sort function
def bubble_sort(list1):
# Outer loop for traverse the entire list
for i in range(0,len(list1)-1):
for j in range(len(list1)-1):
if(list1[j]>list1[j+1]):
temp = list1[j]
list1[j] = list1[j+1]
list1[j+1] = temp
return list1
list1 = [5, 3, 8, 6, 7, 2]
print("The unsorted list is: ", list1)
# Calling the bubble sort function
print("The sorted list is: ", bubble_sort(list1))
输出:
The unsorted list is: [5, 3, 8, 6, 7, 2]
The sorted list is: [2, 3, 5, 6, 7, 8]
说明:
在上面的代码中,我们定义了bubble_sort()函数,该函数以list1作为参数。
我们也可以不使用temp变量而交换元素。 Python具有非常独特的语法。我们可以使用以下代码行。
范例-
def bubble_sort(list1):
# Outer loop for traverse the entire list
for i in range(0,len(list1)-1):
for j in range(len(list1)-1):
if(list1[j]>list1[j+1]):
# here we are not using temp variable
list1[j],list1[j+1] = list1[j+1], list1[j]
return list1
list1 = [5, 3, 8, 6, 7, 2]
print("The unsorted list is: ", list1)
# Calling the bubble sort function
print("The sorted list is: ", bubble_sort(list1))
输出:
The unsorted list is: [5, 3, 8, 6, 7, 2]
The sorted list is: [2, 3, 5, 6, 7, 8]
我们可以使用两种技术来优化上面的代码。交换未完成;这意味着列表已排序。在先前的技术中-先前的技术将评估完整列表,尽管似乎不需要这样做。
我们可以使用布尔值标志防止不必要的评估,并检查上一节中是否进行了任何交换。
范例-
def bubble_sort(list1):
# We can stop the iteration once the swap has done
has_swapped = True
while(has_swapped):
has_swapped = False
for i in range(len(list1) - 1):
if list1[i] > list1[i+1]:
# Swap
list1[i], list1[i+1] = list1[i+1], list1[i]
has_swapped = True
return list1
list1 = [5, 3, 8, 6, 7, 2]
print("The unsorted list is: ", list1)
# Calling the bubble sort function
print("The sorted list is: ", bubble_sort(list1))
输出:
The unsorted list is: [5, 3, 8, 6, 7, 2]
The sorted list is: [2, 3, 5, 6, 7, 8]
在第二种技术中,我们考虑以下事实:当列表的最大元素结束于列表的末尾时,迭代结束。
第一次,我们使用n位置在终点位置传递最大的元素。第二次,我们经过第二大元素n-1位置。
在每个连续的迭代中,我们可以比以前少一个元素进行比较。更准确地说,在第k次迭代中,只需要在前n-k + 1个元素进行比较:
范例-
def bubble_sort(list1):
has_swapped = True
total_iteration = 0
while(has_swapped):
has_swapped = False
for i in range(len(list1) - total_iteration - 1):
if list1[i] > list1[i+1]:
# Swap
list1[i], list1[i+1] = list1[i+1], list1[i]
has_swapped = True
total_iteration += 1
print("The number of iteraton: ",total_iteration)
return list1
list1 = [5, 3, 8, 6, 7, 2]
print("The unsorted list is: ", list1)
# Calling the bubble sort funtion
print("The sorted list is: ", bubble_sort(list1))
输出:
The unsorted list is: [5, 3, 8, 6, 7, 2]
The number of iteraton: 6
The sorted list is: [2, 3, 5, 6, 7, 8]
让我们看看以上代码片段之间的时间比较。
Unoptimized Bubble Sort Takes: 0.0106407
Optimize Bubble Sort Takes: 0.0078251
Bubble Sort with a Boolean flag and shortened list Takes: 0.0075207
所有技术对于较少的元素都是有用的,但是如果列表包含许多元素,则第二种优化技术会产生很大的不同。