zoukankan      html  css  js  c++  java
  • 2 算法查找&排序问题

    一、查找

    1、查找的概念:

    2 顺序查找(linear search)

    从头找到尾

    def linear_search(li,val):
        for ind ,v  in enumerate(li):
            if v==val:
                return ind
            else:
                return None

    3 二分查找(binary search):

    def binary_search(li,val):
        left = 0
        right = len(li)-1
        while left<=right:
            mid = (left+right)/2
            if li[mid] == val:
                return mid
            elif li[mid] >val:
                right = mid -1
            else:
                left = mid + 1
        else:
            return None

    ----------------

    ------------------------------

    二、列表排序

    1、什么是列表排序

    排序:将一组“无序”的记录序列调整为“有序”的记录序列

    列表排序:将无序列表变为有序列表

    输入:列表

    输出:有序列表

    升序和降序

    内置排序函数

    2、常见排序算法介绍

    排序的Low B三人组

    时间复杂度都是O(n^2)

    3、排序算法分析

     冒泡排序(Bubble sort) 走n-1趟

    第一次外层循环把最大的一个数移到最后;第二次外层循环把第二大的移到最后

    每一次内部循环都从索引为0和1的数的比较

    基本思想:对比相邻的元素值,如果满足提条件就交换元素值,把较小的元素移动到数组前面,把较大的元素移动到数组后面,这样较小的的元素就像气泡一样从底部上升到顶部

    def bubble_sort(li):
        for i in range(len(li)-1):# n-1趟
            for j in range(len(li)-i-1): # 每一次内部循环需要比较的次数
                # 
                if li[j]>li[j+1]:
                    li[j],li[j+1] = li[j+1],li[j]
            print(li,f'第{i+1}次外部循环 ,内部循环比较次数{len(li)-i-1}')
    
    li = [4,2,5,1,7,8,9,3,6]
    bubble_sort(li)

     -------------------------

    def bubble_sort(li):
        for i in range(len(li)-1):
            for j in range(len(li)-i-1):
                if li[j]>li[j+1]:
                    li[j],li[j+1] = li[j+1],li[j]
                    # t=li[j]
                    # li[j]=li[j+1]
                    # li[j+1]=t
    import random
    # 列表生成式 L = [x * x for x in range(10)]  生成一个list,长度为1000,里面的元素是可以重复的随机数(范围0-10000)
    li = [random.randint(0,10000) for i in range(1000)]
    print(li)
    bubble_sort(li)
    print(li)

    ---------------------------

    3.2 选择排序(select sort)

    每一次循环选出最小的一个

    基本思想:将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值,把满足条件的元素与指定的排序位置交换

    def select_sort(li):
        for i in range(len(li)-1):
            min = i
            for j in range(min+1,len(li)):
                if li[min]>li[j]:
                    li[min],li[j] = li[j],li[min]
            print(li, f'第{i+1}次外部循环 ,内部循环比较次数{len(li)-min-1}')
    
    li = [4,2,5,1,7,8,9,3,6]
    select_sort(li)
    print(li)
    li = [3,2,4,1,5,6,8,7,9]
    def select_sort_simple(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
    
    
    print('select_sort_simple',select_sort_simple(li))
    
    def select_sort(li):
        for i in range(len(li)-1):
            min_loc = i
            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)
    
    select_sort(li)

    -------------------------------

    复杂度:0(n^2)

     3.3 插入排序

     基本思想:将一个记录插入到已排好序的有序表中,从而得到一个新的,记录数增1的有序表,然后再从剩下的关键字中选取下一个插入对象,反复执行直到整个序列有序。

    def insert_sort(li):
        for i in range(1,len(li)):
            tem = li[i]  # 要插入的数
            j = i-1 # j指的是手里的牌的下标
            while li[j] > tem and j>=0:
                li[j+1] = li[j]
                j -= 1
            li[j+1] = tem
            print(li)
    li = [3,2,4,1,5,7,9,6,8]
    insert_sort(li)
    print(li,'最后结果')

    插入排序的复杂度:O(n^2)

     

      

  • 相关阅读:
    1-1 课程简介 & 2-1 IDEA与Eclipse的不同 & 2-3 Intellij IDEA安装
    MyBatis入门
    贪婪法——————贪心算法
    Java排序之直接选择排序
    是时候学一波STL了。。。
    Java提高篇(三一)-----Stack
    Android 经常使用工作命令mmm,mm,m,croot,cgrep,jgrep,resgrep,godir
    【POJ 2750】 Potted Flower(线段树套dp)
    POJ 题目3321 Apple Tree(线段树)
    Android新手入门2016(14)--FragmentTabHost实现选项卡和菜单
  • 原文地址:https://www.cnblogs.com/foremostxl/p/10209878.html
Copyright © 2011-2022 走看看