常用排序(1)--冒泡、插入、选择排序

冒泡排序

思路:从第一个元素开始,将它与下一个索引元素比较。如果当前元素的值比下一个元素的值要大,则两者交换位置,否则位置不变。

举例说明:arr = [1,3,2,4,8,5]

第一轮:

第一次比较1和3:因为1<3,所以不交换。原始数组arr=[1,3,2,4,8,5]

第二次比较3和2:因为3>2,所以交换。原始数组arr=[1,2,3,4,8,5]

第三次比较3和4:因为3<4,所以不交换。原始数组arr=[1,2,3,4,8,5]

第四次比较4和8:因为4<8,所以不交换。原始数组arr=[1,2,3,4,8,5]

第五次比较8和5:因为8>5,所以交换。原始数组arr=[1,2,3,4,5,8]

第一轮结束后,arr列表中的最后一个数字最大。第二轮重复和第一轮一样的过程,到倒数第二个位置结束,使得倒数第二个位置第二大,以此类推,直到使得整个列表有序。

通过这个例子我们可以看到,因为列表中包含着6个数据,所以冒泡排序一共会比较6轮,每一轮会比较5次,第二轮会比较4次,第三轮会比较3次……

所以当有n个数据的时候,冒泡排序一共会比较n轮,每轮会比较n-i次(i表示轮数)

第一轮结束后,使得列表中1至n位置中n位置上的值最大,也就是使得最后一个位置有序。

第二轮结束后,使得列表中1至n-1位置中n-1位置上的值最大,也就是使得最后两个位置有序。

第三轮结束后,使得列表中1至n-2位置中n-2位置上的值最大,也就是使得最后三个位置有序。

def maopao(arr):
    if len(arr)<2 or arr is None:
        return arr

    for i in range(len(arr)):
        #每一轮比较的次数,且使得最后一个数的值最大
        for j in range(len(arr)-i-1):
            if arr[j]>arr[j+1]:
                arr[j],arr[j+1]=arr[j+1],arr[j]
    return arr

 插入排序

思路:从整个待排序列中选出一个元素插入到已经有序的子序列中去,得到一个有序的、元素加一的子序列,直到整个序列的待插入元素为0,则整个序列全部有序。

举例:arr = [1,3,2,4,8,5]

第一轮使得0-0范围有序,因为0-0范围内只有一个元素,所以默认有序。此时arr = [1,3,2,4,8,5]

第二轮使得0-1范围有序,也就是使得1,3有序,比较0号位置和1号位置的值,如果0号位置的值大则交换。此时arr = [1,3,2,4,8,5]

第三轮使得0-2范围有序,也就是使得1,3,2有序。第一次比较3和2,因为3>2,所以交换位置,第二次比较1和2,因为1<2,所以不用交换位置。此时arr = [1,2,3,4,8,5]

第四轮使得0-3范围有序,也就是使1,2,3,4有序……依次类推

所以当有n个数据时,第一次使得0-1范围有序,第二次使得0-2范围有序,第三次使得0-3范围有序,直到使得0-(n-1)范围有序。

这个过程很像我们斗地主时,先拿第一张牌,然后再拿第二张牌使得手里的牌有序,然后再拿第三张牌,看一下要插入到牌的哪个位置,使得手里的牌有序……

def charu(arr):
    if len(arr)<2 or arr is None:
        return arr
    for i in range(1,len(arr)):
         #第一轮使得0-1有序
        #第二轮使得0-2有序
        #第三轮使得0-3有序
        j=i-1
        while j>=0 and arr[j]>arr[j+1]:
            arr[j],arr[j+1]=arr[j+1],arr[j]
            j=j-1
    return arr

如有列表[5,2,1,3,9]

 

 选择排序

思路:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放待排序序列的起始位置(或末尾位置),直到全部待排序的数据元素排完。

举例说明:

arr = [1,3,2,4,8,5]

第一轮,使得0到n-1范围中的最小值放在0号位置,此时arr =  [1,3,2,4,8,5]

第二轮,使得1到n-1范围中的最小值放在1号位置,此时arr =  [1,2,3,4,8,5]

第三轮,使得2到n-1范围中的最小值放在2号位置,此时arr =  [1,2,3,4,8,5]

……

以此类推,直到整个列表有序

如有列表[5,2,1,3,9]

def xuanze(arr):
    if len(arr)<2 or arr is None:
        return arr

    for i in range(len(arr)):
        minindex=i
        for j in range(i,len(arr)):
            if arr[minindex]>arr[j]:
                minindex=j
        arr[minindex],arr[i]=arr[i],arr[minindex]
    return arr

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值