冒泡算法
冒泡排序: 最一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序算法的运作如下:
比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序的分析
交换过程图示(第一次):
# 冒泡排序 每次遍历都会产生一个最大的 把最大的放在列表的后面
def bubble_sort(li1):
n = len(li1)
for i in range(n-1, 0, -1):
for j in range(0, i):
if li1[j] > li1[j+1]:
li1[j], li1[j+1] = li1[j+1], li1[j]
print(li1)
# 精髓就是每次遍历内层循环都会把最大的数推到后面
插入排序
插入排序我觉得和冒泡排序有点共同处
插入排序有几个步骤
- 首先我们先假设列表索引为0的元素已经是最小了
- 然后接下来我们拿第二个元素和他前面的对比,如果当前元素小于前面的,那就交换位置
- 假设当前外层循环遍历到索引为7的元素了,那么那个元素得和他前面所有元素进行对比,然后放到适合位置。这个插入排序是将无序的数据插入到前面有序的里面,而冒泡是将无序的数据进行对比然后将最大的放后面。
"""插入排序"""
n = len(li2)
# 假设第一个是数据是排好序的是最小的 那我们应该从 第二个开始排序
for i in range(1, n):
for j in range(i, 0, -1):
if li2[j] < li2[j-1]:
li2[j], li2[j-1] = li2[j-1], li2[j]
print(li2)
选择排序
- 先假设外层循环当前遍历的元素就是最小值
- 然后从当前值遍历到列表尾部,在此范围内的所有值都和这个假设的最小值就行对比,如果比最小值还要小那就是当前最小啦,就要交换位置
- 外层循环每遍历一次都,内层循环都会确定一个最小值
def selection_sort(li1):
n = len(li1)
for i in range(n):
min_max_index = i
for j in range(i+1, n):
if li1[min_max_index] > li1[j]:
li1[min_max_index], li1[j] = li1[j], li1[min_max_index]
print(li1)
快速排序
- 首先将第一个元素当作临界点,如果数据排好序后,应该是所有比这个临界点小的都是他左边,所有比这个零界点大的都是他右边
- 先保存这个零界点的值- mid
- 因为我们的零界点是假设左边第一个元素,接下来我们从右边,即列表末尾,如果列表末尾的元素比临界值小,那么这个值就应该放到临界值的左边,放到临界值的位置。否则就继续从右往左遍历
- 上述的右边数据放到了临界点,那右边就有一个空位了,然后从左边开始和临界值进行对比,如果大于临界值,就放到刚才右边的空位。
- 最后我们就找到了真正临界点的位置,左边的数据left_alist都比理解点小,右边的数据right_list都比临界点大。
- 然后我们对两个子列表再进行这样的排序,是不是就产生了四个这样的子序列,到最后子序列只剩两个元素,是不是就排好序了
def quick_sort(my_li, start, end):
"""快速排序"""
if start >= end:
return
n = len(my_li) - 1
left = start
right = end
# 假设 最后一个元素就是我们的分界点元素
mid = my_li[end]
for i in range(start, end):
if my_li[i] < mid:
my_li[i], my_li[left] = my_li[left], my_li[i]
left += 1
# print(my_li)
my_li[left], my_li[end] = my_li[end], my_li[left]
quick_sort(my_li, 0, left-1)
quick_sort(my_li, left+1, end)
li14 = [11,44,2,6,7,5,2,1,2,68,7,22,9,3]
quick_sort(li14, 0, len(li14)-1)
print(li14)