python实现冒泡,选择,插入排序(凑合着看)

前言:

排序无非把无序列表变为有序列表

而且python还有内置函数sort(),但是为了学习算法还是的了解一下这三人组算法

1.冒泡排序

1.思想

1.列表每相邻的两个数,按大小规则,交换位置

2.一趟排序后,无序列表少一个数,有序列表多一个数

2.算法流程:

1.有n个数就要排序n-1次
2.每i次排序的比较次数为n-1-i次
3.每次排序的比较中,大小不一的,就按照升序或是降序的规则,交换顺序

3.算法实现:

#这是按照从小到大的排序
def maopao(li):
    flag = 0
    #控制循环次数,有n个数,就循环n-1次
    for i in range(len(li)-1):
        #没一躺比较,两数比较的次数就是n - 第几趟比较 - 1
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                #两个数交换位置
                flag = li[j + 1]
                li[j + 1] = li[j]
                li[j] = flag
    return li

2.选择排序:

1.思想:(就是每一次找最小的数放到前面 )

1.在列表中,查找一个最小的数放到第一位,然后将原来第一位的数和查找最小的数的位置他两互换,

2.然后从第二位数开始,在这些数中查找一个最小的数放到第二位,然后将原来第二位的数和查找最小的数的位置他两互换

.......

3.然后从第i位数开始,在这些数中查找一个最小的数放到第i位,然后将原来第i位的数和查找最小的数的位置他两互换

2.代码实现

def select_sort(li):
    for i in range(len(li)-1):
        min_local = i #假定第i次比较,以无序区第一个数设为最小值,第一次比较,就设第一个数最小,第i次比较,就设第i次最小
        #然后跟后面的数比较,如果找到一个数比min_local小标的数小,则将min_local记录为这个数的下标
        for j in range(i,len(li)):
            if li[min_local] > li[j]:
                min_local = j
        #在第i躺,循环结束后,交换最小数和无序区第一个数的位置
        li[i] , li[min_local] = li[min_local] , li[i]
    return li

3.插入排序:

1.思想:

1.相当于打牌时,对牌数的大小进行排序,

2.例如先摸到一个牌,

3.然后摸到第二个牌时候这个牌比较,

4.比他大则插到这张牌的后面,比他小则插到这张牌的前面,

5.然后再摸牌,摸到的牌与之前已经摸到并排好序的牌比较,在排好序牌中从右往左与摸到牌比较,

6.摸到的牌比排好序的牌比较,比它大则这些牌向后移,比它小则这个牌插到排好序的牌的后面

2.算法:

1.定义有一个列表:

2.循环遍历这个列表

3.再循环的过程中,用一个数来存储摸到的牌的值

4.然后再内嵌一个循环,用来循环遍历已经排好序的牌,用来跟摸到的牌来进行比较,

5.摸到的牌比排好序的牌比较,比它大则这些牌向后移,比它小则这个牌插到排好序的牌的后面

6.摸到的牌是比较,排好序的牌是被比较的

3.代码实现:

def insert_sort(li):
    #为什么从1开始呢,因为我们假定第一张牌就是已经再手里的牌了,不是摸到的,
    #再从len(li)中区膜牌
    for i in range(1,len(li)):
        #用一个变量来存储摸到的牌
        count = li[i]
        #j表示的是已经拍好序牌中的最右边的下表
        j = i - 1
        while j >= 0 and li[j] < count:
            #将牌向后移动
            li[j+1] = li[j]
            #同时将j向前移动一位
            j -= 1
        #循环结束表示找到了,但是这是后你会发现,j+1的位置是空的,而这正是之前牌后移动的结果,所以直接查插到这个位置
        li[j + 1] = count
    return li

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值