🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法
💫个人格言:"没有罗马,那就自己创造罗马~"
目录
冒泡排序
冒泡排序是一种简单的排序算法,它通过重复地交换相邻的元素来将列表按照升序或降序进行排序。
具体的排序过程如下:
-
从列表的第一个元素开始,比较它和它后面的元素。如果第一个元素比后面的元素大(或小,取决于排序顺序),则交换它们的位置。
-
继续对列表中的每一对相邻元素进行比较和交换,直到到达列表的末尾。
-
重复上述步骤,每次比较和交换的范围缩小一位,直到整个列表被排序。
在一次完整的遍历中,最大(或最小)的元素会“冒泡”到列表的最后一个位置。因此,称之为冒泡排序。
冒泡排序的时间复杂度为O(n^2),其中n是列表的长度。尽管它是一种简单的排序算法,但它的性能相对较差,在处理大型列表时效率较低。
过程演示:
做题实际遇到的图像是横向的,但是它位置变化和纵向是一样的,上面的gif图是为了让大家更加直观的看清楚冒泡排序。
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
插入排序是连续对比,而冒泡排序是挨个对比
第1趟比较交换,【共有n-1】 即如图中的4对相邻数据进行比较,一旦经过最大项,则最大项会一路交换到达最后
一项
第2趟比较交换时,最大项已经就位,需要排序的数据减少为n-1,共有n-2对相邻数据进行比较
直到第n-1趟完成后,最小项一定在列表首位,就无需再处理了。
冒泡排序实现代码:
def bubble_sort(q):
#循环遍历(起泡)次数
for i in range(0,len(q)):
#每次起泡里比对的次数
for j in range(0,len(q) - i - 1 ):
#当前位置的值大于下一个位置的值
if q[j] > q[j + 1]:
q[j] , q[j + 1] = q[j + 1] , q[j]
return q
list = [1,5,33,88,44,77,99,0,66]
print(bubble_sort(list))
分析冒泡排序:
分析冒泡排序算法时要注意,不管一开始元素是如何排列的,给含有n个元素的列表排序总需要遍历 n-1轮。
下表展示了每一轮的比较次数。
总的比较次数是前 n-1个整数之和。即: (1 / 2)n² + (1 / 2)n ,可以看出这个算法的时间复杂度是 O(n²)。
在最好情况下,列表已经是有序的,不需要执行交换操作。
在最坏情况下,每一次比较都将导致一次交换。
劣势:冒泡排序通常作为时间效率较差的排序算法,来作为其它算法的对比基准,其效率主要差在每个数据项在找到其最终位置之前必须要经过多次比对和交换,其中大部分的操作是无效的。
优势:就是无需任何额外的存储空间开销。
Practice1:
抓住冒泡排序的特点,最大的往后排,所以选B。
📝总结:
拓展:
冒泡排序是一种简单直观的排序算法,其基本思想是重复地遍历待排序的元素,比较相邻的两个元素,如果顺序不对则交换位置,直到整个序列有序为止。冒泡排序的时间复杂度为O(n^2)。
冒泡排序的历史可以追溯到上世纪50年代,当时计算机处理速度很慢,存储容量十分有限。冒泡排序是一种简单且容易实现的排序算法,因此在早期计算机系统中得到广泛应用。它的原理简单,只需要比较和交换相邻元素,这样的操作在早期计算机上比较容易实现。
随着计算机技术的发展,冒泡排序的效率逐渐被更高效的排序算法所替代,比如快速排序、归并排序等。这些排序算法的时间复杂度更低,适应性更强。冒泡排序并不是一种高效的排序算法,但它的思想和操作过程对于理解和学习其他排序算法是有帮助的。
尽管冒泡排序在实际应用中不常见,但它作为一种经典的排序算法,仍然被广泛用于教学和学术研究中。通过理解冒泡排序的原理和过程,可以更好地理解其他排序算法的思路和实现方式。
def bubbleSort(arr):
for i in range(1, len(arr)):
for j in range(0, len(arr)-i):
if arr[j] > arr[j+1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr