栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

数据结构与算法01

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构与算法01

时间复杂度

 空间复杂度

说的简单一点就是占用内存空间的多少,但是现在不怎么考虑了

递归

1. 调用自己

2.终止条件

汉诺塔问题

# 汉诺塔问题

def hannoi(n,a,b,c):
    if n>0:
        hannoi(n-1,a,c,b)
        print("from %s to %s"%(a,c))
        hannoi(n-1,b,a,c)


if __name__ == '__main__':
    hannoi(3,"a","b","c")

查找

顺序查找
def search(li,div):
    for ind,v in enumerate(li):
        if v==div:
            return ind
    else:return None


div=3
li=[1,2,3,4,5,6,7]

print(search(li,div))

二分查找

注意 :二分查找要基于数据是排好序的状态才能使用

'''
这个编程 是二分法查找
'''
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
        elif(li[mid] 

排序

 选择排序

原理是 每次都挑选出来列表中最小的一个数出来 将他放在前面

list =[1,5,3,7,6,4,2,8]

for i in range(len(list)):
    min=i
    for j in range(i+1,len(list)):
        if(list[min]>list[j]):
            list[min],list[j]=list[j],list[min]


print(list)

插入排序

摸牌排序

def insert_sort(li):
    for i in range(1,len(li)):
        temp=li[i]  # 要摸n-1次
        j=i-1 #j是手中的牌
        while j>=0 and li[j]>temp:
            li[j+1]=li[j]
            j-=1

        li[j+1]=temp

if __name__ == '__main__':
    list=[0,1,3,5,4,7,6,9,8]
    insert_sort(list)
    print(list)

Nb三人组 快速排序

思路: 找一个值作为分界点,将头和尾部进行遍历与分界点的值进行比较,左边全为比分界点的值要小的值,右边是比分界点的值要大的值。通过递归进行更加细致的排列,最终形成有序

def partition(li,left,right):
    temp=li[left]
    while left=temp:
            right-=1  #一直往右找比基准值小的数

        li[left]=li[right]
        while left 
堆排序 

树:由字面理解,数据排布方式就像一颗树一样有根和叶

有比较特殊的两种树 如下图显示

 

顺序的存储方式其实就是从上往下再加上从左往右的顺序去数

大根堆与小根堆

 

堆排序的过程

 代码

def sift(li,low,high):
    '''

    :param li: 列表
    :param low:堆的根节点
    :param high: 堆的最后一个叶子节点
    :return:
    '''
    i=low #i是最开始指向根节点
    j=2*i+1 #j是开始的左孩子
    tmp=li[low] #把顶部存起来
    while j<=high:
        if j+1<=high and li[j+1]>li[j]:
            j=j+1
        if li[j]>tmp:
            li[i]=li[j]
            i=j
            j=2*j+1
        else:
            li[i]=tmp
            break
    else:li[i]=tmp

def heap_sort(li):
    n=len(li)
    for i in range((n-2)//2,-1,-1):
        sift(li,i,n-1)
    #堆建完了
    for i in range(n-1,-1,-1):
        li[0],li[i]=li[i],li[0]
        sift(li,0,i-1)

if __name__ == '__main__':
    li=[i for i in range(100)]
    import random
    random.shuffle(li)
    print(li)
    heap_sort(li)
    print(li)

 

堆排序topk问题

就是找到前k个最大或者最小的数

 注意:关于稳定,是指相同值的两个数排序后的相对位置是否发生改变

归并排序

思路:将无序列表切割,分成各个部分,再进行组合形成有序

def merge(li,low,high):
    i=low
    mid=(low+high)//2
    j=mid+1
    litmp=[]
    while i<=mid and j<=high:
        if li[i] 
 其他排序 
希尔排序
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002794.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号