一、单向冒泡-降序
# 单向冒泡-降序
def BubbleSort():
L = [5, 2, 3, 1, 4]
n = len(L)
for i in range(n):
for j in range(0, n - i - 1):
if L[j + 1] > L[j]:
L[j], L[j + 1] = L[j + 1], L[j]
print(L)
二、双向冒泡排序-升序
# 双向选择排序
def BidirectionalSelectionSort():
a = [65, 8, 2, 8, 0, 9, 8, 7, 6, 22, 5, 2, 4]
left, right = 0, len(a) - 1
while left < right:
imin = imax = left
for k in range(left + 1, right + 1):
if a[k] < a[imin]:
imin = k
elif a[k] > a[imax]:
imax = k
if imin != left:
a[imin], a[left] = a[left], a[imin]
if imax == left:
imax = imin
if imax != right:
a[imax], a[right] = a[right], a[imax]
left = left + 1
right = right - 1
print(a)
三、双向冒泡存在的意义
1、双向冒泡排序,也称为鸡尾酒排序或定向冒泡排序,是一种排序算法。它的意义在于优化传统冒泡排序的性能,特别是对于有大量逆序元素的情况。
2、传统冒泡排序从列表的一端开始,通过比较和交换相邻元素来将最大(或最小)的元素冒泡到列表的末尾。这个过程需要多次遍历列表,每次遍历都将一个最大(或最小)的元素放置在正确的位置上。而双向冒泡排序从列表的两端同时开始,分别进行正向和反向的冒泡过程。在每次遍历中,它交替进行正向冒泡和反向冒泡,将较小的元素冒泡到列表的前端,将较大的元素冒泡到列表的后端。这样,相对于传统冒泡排序,双向冒泡排序在每次遍历中可以同时找到最小和最大的元素,并将它们归位。
3、双向冒泡排序的意义在于具有以下特点:
1)减少排序过程中不必要的遍历次数:传统冒泡排序每次遍历只能找到最大(或最小)的元素,而双向冒泡排序每次遍历同时找到最小和最大的元素。这样可以减少排序过程中的不必要遍历次数,提高性能。
2)适用于有大量逆序元素的情况:当待排序列表中存在大量逆序元素时,传统冒泡排序的性能较差,需要进行多次遍历。而双向冒泡排序可以同时从列表的两端进行排序,减少逆序元素的交换次数,提高排序效率。
尽管双向冒泡排序在某些特定情况下可以提高性能,但它的时间复杂度仍然为O(n^2),因此在面对大规模数据时,更高效的排序算法,如快速排序、归并排序等,往往是更好的选择。
四、冒泡图示
以升序向右冒泡为例:


683

被折叠的 条评论
为什么被折叠?



