zoukankan      html  css  js  c++  java
  • 数据结构与算法(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)

     

    不稳定

    较复杂

    三.数组与链表

  • 相关阅读:
    Python request
    Dockerfile详解
    k8s 英文文档翻译
    k8s 相关命令
    k8s 廖老师的分享
    Docker docker-compose安装
    Mysql 锁库与锁表
    Docker 二进制安装docker
    Java多线程的同步控制记录
    JAVA并行程序基础
  • 原文地址:https://www.cnblogs.com/gongcheng-/p/9681746.html
Copyright © 2011-2022 走看看