• 数据结构与算法(Python)



    一.数据结构与算法概述

    数据结构与算法的定义

    我们把现实中大量而且非常复杂的问题以特定的数据类型(个体)和特定的存储结构(个体的关系)保存到相应的主存储器(内存)中,以及在此基础上为实现某个功能而执行的相应操作,这个相应操作也叫做算法.

    数据结构 = 个体 + 个体的关系

    算法 = 对存储数据的操作

    二.衡量算法的标准

    时间复杂度 指的是大概程序执行的次数,并非程序执行的时间

    空间复杂度 指的是程序执行过程中,大概所占有的最大内存

    常用的查找

    顺序查找

    lowB for循环

    时间复杂度 O(n)

    def linerSearch(li,val):
        for i in range(len(li)):
            if li[i] == val:
                return i
    顺序查找

    二分查找

    二分查询的列表必须有序!

    时间复杂度 O(logn)

    # 递归
    def binarySearch(li,low,high,val):
        if low < high:
            mid = (low+high) // 2
            if li[mid]==val:
                return mid
            elif li[mid]<val:
                binarySearch(li,mid+1,high,val)
            elif li[mid]>val:
                binarySearch(li,low,mid-1,val)
        else:
            return -1
    
    # 循环
    def binary_search(li,value):
        low = 0
        high = len(li)
        while low <= high:
            mid = (low+high)//2
            if li[mid] == value:
                return mid
            elif li[mid] > value:
                high = mid -1
            else:
                low = mid +1
    二分查找

    常用的几个排序

    冒泡排序

    时间复杂度:O(n2)

    def BubbleSort(li):
        for i in range(len(li)):
            flag = False
            for j in range(len(li)-i-1):
                if li[j]>li[j+1]:
                    li[j],li[j+1] = li[j+1],li[j]
                    flag = True
            if not flag:
                return li
    冒泡排序

    选择排序

    时间复杂度:O(n2)

     

    def selectSort(li):
        for i in range(len(li)):
            for j in range(i+1,len(li)):
                if li[i] > li[j]:
                    li[i],li[j] = li[j],li[i]
        print(li)
    选择排序

    插入排序

    时间复杂度:O(n2)

     

    def insertSort(li):
        for i in range(1,len(li)):
            tmp = li[i]
            j = i - 1
            while j>=0 and li[j]>tmp:
                li[j+1] = li[j]
                j-=1
            li[j+1]=tmp
        print(li)
    插入排序

    快速排序

    时间复杂度:O(nlogn)

     

    # 一次调整
    def partition(li,left,right):
        tmp = li[left]
        while left <right:
            while left < right and li[right]>=tmp:
                right=right - 1
            li[left] = li[right]
            while left < right and li[left] <= tmp:
                left+=1
            li[right] = li[left]
        li[left] = tmp
        return left
    
    # 快速排序
    def quickSort(li,left,right):
        if left < right:
            mid = partition(li, left, right)  ### O(n)
            quickSort(li, left, mid - 1)     ### O(logn)
            quickSort(li, mid + 1, right)
    快速排序

    归并排序

    时间复杂度:O(nlogn)

     

    # 一次归并
    def merge(li,low,mid,right):
        i = low
        j = mid +1
        ltmp = []
        while i <= mid and j <=right:
            if li[i] <li[j]:
                ltmp.append(li[i])
                i = i + 1
            else:
                ltmp.append(li[j])
                j = j + 1
        while i <= mid:
            ltmp.append(li[i])
            i = i + 1
        while j <= right:
            ltmp.append(li[j])
            j = j + 1
        li[low:right + 1] =ltmp
    
    
    def mergeSort(li, low, high):
        if low < high:
            mid = (low + high) // 2
            mergeSort(li, low, mid)
            mergeSort(li, mid + 1, high)
            print('归并之前:', li[low:high+1])
            merge(li, low, mid, high)
            print('归并之后:', li[low:high + 1])
    归并排序

    希尔排序

    时间复杂度:O(nlogn)

     

    def shell_sort(li):
        gap = len(li)//2
        while gap > 0 :
            for i in range(gap,len(li)):
                tmp = li[i]
                j = i -gap
                while j>=0 and tmp <li[j]:
                    li[j + gap ] = li[j]
                    j -= gap
                li[j + gap] = tmp
            gap //= 2
    希尔排序

    计数排序

    时间复杂度:O(nlogn)

    def countSort(li):
        li_new=[]
        count = [0 for i in range(len(li))]
        for i in li:
            count[i]+=1
    
        for index,val in enumerate(count):
            print(index,val)
            for i in range(val):
                li_new.append(index)
        print(li_new)
    计数排序

    排序小结

    排序方法

    时间复杂度

    稳定性

    代码复杂度

    最坏情况

    平均情况

    最好情况

    冒泡排序

    O(n2)

    O(n2)

    O(n)

    稳定

    简单

    直接选择排序

    O(n2)

    O(n2)

    O(n2)

    不稳定

    简单

    直接插入排序

    O(n2)

    O(n2)

    O(n2)

    稳定

    简单

    快速排序

    O(n2)

    O(nlogn)

    O(nlogn)

    不稳定

    较复杂

    堆排序

    O(nlogn)

    O(nlogn)

    O(nlogn)

    不稳定

    复杂

    归并排序

    O(nlogn)

    O(nlogn)

    O(nlogn)

    稳定

    较复杂

    希尔排序

     

    O(1.3n)

     

    不稳定

    较复杂

    三.数组与链表

  • 相关阅读:
    ssh免密码登录
    nginx做负载均衡+keepalived(做主备)
    centos之Too many open files问题-修改linux最大文件句柄数
    redis-JedisPoolConfig配置
    Hadoop端口说明
    hadoop 2.5 安装部署
    Java集合框架 10 连问,你有被问过吗?
    Dubbo面试八连问,这些你都能答上来吗?
    面试官:关于Java性能优化,你有什么技巧
    Docker从入门到掉坑(三):容器太多,操作好麻烦
  • 原文地址:https://www.cnblogs.com/gongcheng-/p/9681746.html
Copyright © 2020-2023  润新知