入坑后的算法初学:用Python实现冒泡排序
参考书籍:《我的第一本算法书》
实现语言:Python
一:算法步骤描述(自己理解的,不一定准确,欢迎指正):
(1)得到一个任意排序任意长度大小的数字序列,假设将它分为已被排序过的"有序区间"和未被排序过的"待排序区间"
(2)从它的最右边一个数字开始依次和它的前一个数字进行比较,将这2个数字中较小的数字放置到这两个数字中靠左那个数字的位置,直到被比较的两个数碰到"有序数列区间"前停止。
(3)步骤(2)算比较完一轮,每比较完一轮,每一轮比较下来都会产生一个最小数,它们会被放置到现有"有序数列区间"的最后一位。直到所有的数都被放置到"有序数列区间"中时排序停止
上面看不懂没关系,下面将会插入图片进行讲解(其实直接看图也是可以的,记录上面一方面是为了加深自己的理解)
二:代码块(尽量遵循自己理解的描述以及上述图片流程)
'''
需求:输入一个数字列表,按从小到达输出
算法选择:冒泡排序
算法解析:
冒泡排序就是重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字
的位置”这一操作的算法。在这个过程中,数字会像泡泡一样,慢慢从右往左“浮”到序列的
顶端,所以这个算法才被称为“冒泡排序”。
'''
def maopao(num_list):
for i in range(0,len(num_list)):
'''
i表示有序区间的索引 [0,i)
j表示待比较区间的索引[i,数组总长度) => [i,数组长度-1]
i:[-∞,0) j:[0:7] #i这里不可能为-∞,所以第一轮比较的时候,有序区间是没有数字放置的
i:[0:1) j:[1:7]
i:[0:2) j:[2:7]
........ .........
i:[0:7) j:[7:7]
(1)随着每比较一轮,i都会增大1,代表一轮比较中的最小数字已被放置到有序区间中的最后一位
(2)第二层for循环中,j是从数组最后一个数开始的,和它的前一个数字开始比较,
(3)将它们中较小的数字放置在两个数字中靠左边那个数字的位置,直到比较到有序区间的前一位停止(有序区间不参与比较)
(4)比较完一轮后j又从右边从头开始新的一轮,直到碰到有序区间停止然后进行下一轮........
(5)所有的轮数待所有数字都待在有序区间内为止
'''
for j in range(-1,-len(num_list)+i,-1):
if(num_list[j] < num_list[j-1]):
num_list[j],num_list[j-1] = num_list[j-1],num_list[j] #交替两个数字的位置
return num_list
print(maopao([2,5,6,8,4,7,1,3]))
第一篇博客文章就结束辽(第一次写,欢迎指正),之后将持续更新自己的学习总结,笔者是从事后端web开发,所以文章不限于数据结构和算法