python数据结构与算法之--排序(1)

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值