zoukankan      html  css  js  c++  java
  • 【Python学习笔记】-冒泡排序、插入排序、二分法查找

    冒泡排序

    主要是拿一个数与列表中所有的数进行比对,若比此数大(或者小),就交换位置

    
    
    l=[5,3,6,2,1,4,8,7,9]
    for j in range(len(l)-1):
        if l[j] > l[j+1]:
            l[j],l[j+1] = l[j+1],l[j]
    print(l)

     输出  [3, 5, 2, 1, 4, 6, 7, 8, 9]



    运行上面的代码会发现最大的已经跑到最后一个位置了,那再加一次循环,循环列表的长度的次数,就可以把所有的都排好序了


    l=[5,3,6,2,1,4,8,7,9]
    
    for i in range(len(l)-1):
        for j in range(len(l)-1-i):
        #这里加了个-i,目的是为了简化循环次数,例如循环第三次的时候,后面两个的数就已经排好序了,没必要继续判断
            if l[j] > l[j+1]:
                l[j],l[j+1] = l[j+1],l[j]
    print(l)

    输出   [1, 2, 3, 4, 5, 6, 7, 8, 9]

    插入排序

    有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序 
    —来自百度百科 
    扑克排序

    基本思想为:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 

    插入排序就是用一个数与一个已排好序的序列进行比对,从右向左进行。 
    例:5与3进行比较,5>3,将5与3不进行交换。l=[3,5], 
    此时再进行排序。4 < 5 l=[3,4,5] 3<4不进行交换,l=[3,4,5] 
    实例:

    l=[1,5,4,7,9,3,2,6,8]
    
    for i in range(1,len(l)):
        for j in range(i,0,-1):
            if l[j] < l[j-1]:
                l[j],l[j-1] = l[j-1],l[j]
            else:
                break
    print(l)

    输出 [1, 2, 3, 4, 5, 6, 7, 8, 9]

     

    二分法查找

    二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
    此方法适用于不经常变动而查找频繁的有序列表。

    首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
    实例:

    l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    find_num = int(input('请输入一个数字:'))
    start = 0    #第一个数
    end = len(l) - 1  #最后一个 减一
    
    while True:
        middle = (start + end) // 2  #头尾相加并取整数
        if find_num == l[middle]:  #如果输入的数在这个l[] 并等于它,就说明找到了
            print('找到了!索引是:', middle)  下标索引
            break
        elif find_num > l[middle]:    如果输入的数大于middle 就加一
            start = middle + 1  加一
        elif find_num < l[middle]:     如果输入数小于middle就减一
            end = middle - 1  减一  
        if start > end:          否则没找到
            print('没找到!', find_num)
            break
    
    
    

    请输入一个数字:4
    找到了!索引是: 3 









  • 相关阅读:
    快速幂模板
    部分有关素数的题
    POJ 3624 Charm Bracelet (01背包)
    51Nod 1085 背包问题 (01背包)
    POJ 1789 Truck History (Kruskal 最小生成树)
    HDU 1996 汉诺塔VI
    HDU 2511 汉诺塔X
    HDU 2175 汉诺塔IX (递推)
    HDU 2077 汉诺塔IV (递推)
    HDU 2064 汉诺塔III (递推)
  • 原文地址:https://www.cnblogs.com/yh-z/p/10058592.html
Copyright © 2011-2022 走看看