今天是数据结构与算法专栏的第一天,从最简单的冒泡排序开始吧~
1.冒泡排序的原理。
冒泡排序是对数组或序列进行从小到大(或从大到小)进行排序的一种算法。是三种基础排序方法之一。冒泡排序需要使用两次循环,内层循环和外层循环。内层循环负责每一趟的两个元素的比较和需要循环进行的操作,外层循环负责需要对比的趟数。
内层循环中每一次从第一个元素开始,如果这个元素比后面一个元素大,就把这个元素和后面的一个元素交换位置,如果比后面一个小,就不做变化。这样每一趟都会有一个最大的元素放在最后,放在最后的元素就不需要去动了。
原理可视化:
2.代码实现。
给栋梁端上代码:
list = [2, 3, 1, 5, 4]
for i in range(len(list) - 1):
# len函数获取的是列表的元素的个数,减i是因为每次执行完内循环后,最大的一个数就放到了最后,不需要再比较
for j in range(1, len(list) - i):
if list[j - 1] < list[j]: # 每一次比较,如果前面一个元素比后面一个大,就交换位置
list[j - 1], list[j] = list[j], list[j - 1]
3.关于代码的优化。
在冒泡排序中,我们有概率会遇到已经从小到大排好了的列表,如果在一次次比较会非常浪费时间,冒泡排序属于时间复杂度比较高的排序方式,所以,我们可以这样优化。
先定义一个变量isExchage = False。在内层循环中,如果至少发生了一次元素的位置交换,就把isExchange赋值为True,在第一趟走完后,如果一次交换也没有发生,则说明原来的序列是从小到大排列的,便直接返回序列,结束即可。
优化:
list = [2, 3, 1, 5, 4]
def bubble_sort(list):
isExchange = False
for i in range(len(list) - 1):
for j in range(1, len(list) - i):
if list[j - 1] < list[j]:
list[j - 1], list[j] = list[j], list[j - 1]
isExchange = True
if not isExchange: # 如果第一次循环发生了数值交换,以后就不会再执行该语句了
return list
return list
4.冒泡排序的时间复杂度。
冒泡排序时间复杂度为O(n²),时间复杂度较高,一般很少使用。
好啦~写完下班了⨎
客官看一看,给个免费的点个赞也好啊~呜呜~救救孩子吧
回应我吧,看官!