python学习笔记(3)--搜索和排序算法

python的简单的搜索和排序算法

  • 查找算法

    • 查找是否存在

      • 线性搜索

        • #线性查找一个数是否存在
          a=[]
          x=int(input())
          flag=False
          for k in a:
              if k==x:
                  flag=True
                  break
           #如果使用for实现的话,必须需要一个flag标志,因为他跟c的for不太一样,for循环最后的值是a中最后一个元素,有可能你的数就在最后一位
          #突然相当,也可以利用python的for. else实现,这就不需要break
          
          a=[]
          x=int(input())
          for k in a:
              if k==x:
                  break
          else:
              print("not found")
          #由于break会跳出for循环,包括else,就算在最后一个也没事
          
          a=[]
          x=int(input())
          while index <len(a):
              if a[index]==x:
                  break
          else:
              print("not found")
          #因为python多了一个else,所以换成c的话就是
          if index>=len(a):
              print("not found")
          #当然for也可以用range(len(a))进行下标检索,但如果不使用else语句的话,还是要用flag位,就算是for index in range(len(a)),index最后的结果还是len(a)-1
          #不过我还是推荐大家使用下标吧,因为下标可以给予我们多的一个信息,但有人会说,有index函数呀,就算有这个函数,你在循环里面>,>=效果是不一样的,一个是首次出现,一个是最后一次出现,用index,少给自己找麻烦
          
      • 二分查找

        • #二分可以理解为每次查找范围缩一半,前提一个要是个排序好的数组,而且是按照从小到大,不过从大到小也可以,只是改变二分缩的方向,
          a=[]
          x=int(input())
          left=0
          right=len(a)-1
          index=-1#保存下标
          #这里我们考虑一下跳出循环的条件,如果一直不匹配的话,数组缩到1个元素,这个时候发生什么,left=right,如果我们要查找的数偏小,right-1,偏大,left+1,最后left都会大于right
          while left<=right:
              mid=(left+right)//2
              if a[mid]>x:
                  #说明x在左边
                  right=mid-1
              elif a[mid]<x:
                  left=mid+1
              else:
                  index=mid
                  break
          
    • 最值

      • 线性搜索

        • a=[]
          max_index=0
          for index in range(1,len(a)):
              if a[max_index]<a[index]:
                  max_index=index
                  break
          #这里我就算不加break,也一定保存的是首次出现的最大值,我加break只是防止浪费资源
          
  • 排序算法

    • 选择排序

      • #把最大值放到最后,把最小值放到最前面
        a=[]
        
        #最大值的
        for right in range(len(a)-1,0,-1):
            #这是外层循环,len(a)-1开始,到1结束(不会到0,所以到1),不需要到0因为到0了只有一个数了,不需要比较
            maxid=0
            for index in range(1,right+1):
                #要遍历到right+1,因为这里的right代表的是最后一个元素,right+1实际上只到right(range特性)
                if a[maxid]<a[index]:
                    maxid=index
            a[maxid],a[right]=a[right],a[maxid]
            
        #最小值的
        for left in range(len(a)-1):
            #只用做到len(a)-2就好,到len(a)-1的时候只有一个数了
            minid=left
            for index in range(left+1,len(a)):
                if a[minid]>a[index]:
                    minid=index
            a[minid],a[index]=a[index],a[minid]
        
    • 冒泡排序

      • #同样可以有两个方向冒泡,大和小
        #这里以最大值冒泡,放到最后面
        a=[]
        for right in range(len(a)-1,0,-1):
            for index in range (right):
                if a[index]>a[index+1]:
                    a[index],a[index+1]=a[index+1],a[index]
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值