1、冒泡排序(buttle sort)
- 列表每两个相邻的数,如果前面的别后面的大就交换两个数的位置
- 一趟排序完成后,则无序区减少一个数,有序区增加一个数。
import random
# 冒泡排序
def bubble_sort(li):
for i in range(len(li)-1): # 排序次数
for j in range(len(li)-1-i): #排序次数减i次
if li[j] < li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
print(li)
# 两层循环;每层每次循环每个相邻的数互换一次位置:j0和j1互换,j1和j2互换,j2和j3互换
# 因为i每循环一次就增加一个有序区元素,所以第二层循环就比第一层循环减少i次
li = [random.randint(0 ,100) for i in range(10)]
print(li)
bubble_sort(li)
print(li)
# 冒泡排序
# 时间复杂度O(n的2次方)
# 改进,思考如果在其中的一次排序中列表没有发生改变,就可以直接输出
# 加循环中加入 exchange True>>>>>>>print(li)
2、选择排序
- 一一趟排序记录最小的数,放在第一位
- 在排序记录无序区的最小的数放在第二位
- 。。。
- 算法关键:有序区、无序区、无序区最小数
# 选择排序
# def select_sort(li):
# li_new = []
# for i in range (len(li)):
# min_val = min(li)
# li_new.append(min_val)
# li.remove(min_val)
# return li_new
#
# li = [3,2,14,233,432,222]
# print(select_sort(li))
# 优化后
def select_sort_new(li):
for i in range(len(li)-1):
min_loc = i # location 位置
for j in range(i+1, len(li)):
if li[j] < li[min_loc]:
min_loc = j
li[i], li[min_loc] = li[min_loc], li[i]
print(li)
li = [3,2,14,233,432,222]
select_sort_new(li)
3、插入排序
就是从第二个数开始,如果第二个数比第一个数小就交换位置,
第三个数如果比第二个数小就继续互换位置,然后
# 插入排序
def insert_sort(li):
for i in range(1,len(li)): # i是摸到的牌
tmp = li[i]
j = i-1
# j相当于i前面的数的下标(在数值方面),但是新设置j是为了多次比较不同li[i]数值的比较
while j >= 0 and li[j] > tmp: # 如果前面的数大于后面的数,而且j没超过可取的范围
li[j+1] = li[j] # 就互换位置
j -= 1
# 这个的意思就是继续比较li[j+1](也就是li[i]的值)和前两位、三位、、、直到比到最前面的第一个数li[0],重复换位操作
li[j+1] = tmp
print(li)
li = [5,8,6,7,3,9]
insert_sort(li)