本篇主要介绍排序算法中的冒泡排序 选择排序和插入排序
一 冒泡排序
1、思路:首先,列表每两个相邻的数比较大小,如果前边的比后边的大,那么这两个数就互换位置。就像是冒泡一样
2、代码关键点:
- 趟数:n-1趟
- 无序区
3、图示说明:依次类推就会得到排序结果。冒泡排序的效率还是很低的
时间复杂度:O(n2)
实现代码:
def bubble_sort2(data_list):
'''
首先, 列表每两个相邻的数如果前边的比后边的大, 那么交换这两个数
算法复杂度O(n²)
关键点:趟 无序区
:param data_list:
:return:
'''
for i in range(0, len(data_list) - 1):
# i 表示第i趟 有序区有i个数
exchange = False
for j in range(0, len(data_list) - i - 1):
if data_list[j] > data_list[j + 1]:
data_list[j], data_list[j + 1] = data_list[j + 1], data_list[j]
exchange = True
if not exchange: # 如果在1趟没有进行交换证明已经排好序了 提前终止
return
二 选择排序
1、思路:一趟遍历完记录最小的数,放到第一个位置;在一趟遍历记录剩余列表中的最小的数,继续放置
2、代码关键点:
- 无序区
- 最小数的位置
时间复杂度:O(n2)
def select_sort(li): for i in range(0, len(li) - 1): # 第i趟 有序区范围:[0:i] 无序区范围:[i:n] min_loc = i # 最小数 for j in range(i + 1, len(li)): if li[min_loc] > li[j]: min_loc = j li[i], li[min_loc] = li[min_loc], li[i]
三 插入排序
1、思路:元素被分为有序区和无序区两部分。最初有序区只有一个元素。每次从无序区中选择一个元素,插入到有序区的位置,直到无序区变空。
2、代码关键点:
- 摸到的牌
- 手里的牌
3、图示说明
插入后:
实现代码
''' 推算过程 li = [10,5,7,9,8,3 ] 第一趟:i = 1 j = 0 tmp = 5 条件满足j>=0 并且 li[j](10) > tmp(5) 进入循环 li[j+1](5) = li[j](10) j=-1 [5,10,7,9,8,3] 第二趟:i = 2 j = 1 tmp = 7 条件满足j>=0 并且 li[j](10) > tmp(7) 进入循环 li[j+1](7) = li[j](10) j=0 [5,7,10,9,8,3] 第三趟: i = 3 j = 2 tmp = 9 条件满足j>=0 并且 li[j](10) > tmp(9) 进入循环 li[j+1](9) = li[j](10) j=1 [5,7,9,10,8,3] 第四趟:i = 4 j = 3 tmp = 8 条件满足j>=0 并且 li[j](10) > tmp(8) 进入循环 li[j+1](8) = li[j](10) j=2 [5,7,9,8,10,3] 再次满足 条件满足j>=0 并且 li[j](9) > tmp(8) 进入循环 li[j+1](8) = li[j](9) j=1 [5,7,8,9,10] ''' def insert_sort(li): for i in range(1, len(li)): # i即表示趟数,也表示摸到的牌的下标 # j表示手里最后一张牌 j = i - 1 tmp = li[i] while j >= 0 and li[j] > tmp: li[j + 1] = li[j] j -= 1 li[j + 1] = tmp