• 总结篇3-python数据结构和算法


    业务代码最多的就是搞清楚业务关系,增删改查,实现业务功能,但是数据结构和算法却能提升性能,一个功能请求一次需要运行2^n还是n^2的时间,最终反映到用户响应时间差别是很大的,甚至有时候不优化性能可能就会卡死。

    八大算法:

    https://blog.csdn.net/u013719780/article/details/49201143/

    记代码是没用的,关键要记住思想

    1.插入排序

    将一个数插入到一个有序列表中,从第一个位置开始,调整顺序,直到有序

    def insert_sort(lists):
    count = len(lists)
    for i in range(1, count):
    j = i - 1
    key = lists[i]
    while j >= 0:
    if key < lists[j]:
    lists[j+1] = lists[j]
    lists[j] = key
    j = j - 1
    return lists

    2.希尔排序

    def shellSort(arr):

    n = len(arr)
    gap = int(n / 2)

    while gap > 0:

    for i in range(gap, n):

    temp = arr[i]
    j = i
    while j >= gap and arr[j - gap] > temp:
    arr[j] = arr[j - gap]
    j -= gap
    arr[j] = temp
    gap = int(gap / 2)

    arr = [12, 34, 54, 2, 3]

    n = len(arr)
    print("排序前:")
    for i in range(n):
    print(arr[i]),

    shellSort(arr)

    print(" 排序后:")
    for i in range(n):
    print(arr[i]),

    3.简单选择排序

    每次选一个最小的元素放到列表指定位置

    def select_sort(lists):
    for i in range(0, len(lists) - 1):
    min_index = i
    for j in range(i + 1, len(lists)):
    if lists[j] < lists[min_index]:
    min_index = j
    if min_index != i:
    lists[i], lists[min_index] = lists[min_index], lists[i]
    return lists


    print(select_sort(listA))
    一开始尝试记录数值,后来发现还是记录下标最方便写,因为根本思想就是选择最小元素跟指定坐标交换
    时间复杂度O(n^2)

    4.堆排序

    5.冒泡排序

    比较相邻元素,较大的数往右,实际上每次循环都是让最大的数往右靠了。优化的话可以考虑最小的数同时也往左靠。

    def bubble_sort(lists):
    for i in range(0, len(lists)-1):
    for j in range(i+1, len(lists)):
    if lists[i] > lists[j]:
    lists[i], lists[j] = lists[j], lists[i]
    return lists
    时间复杂度显然是O(n^2)

    6.快速排序

    选择一个基准值,一般第一个或者最后一个元素,比之大的往右交换,比之小的往左交换

    #很酷的写法,快速排序
    def quicksort(arr):
    if len(arr) <= 1:
    return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quicksort(left) + middle + quicksort(right)

    print(quicksort([3,6,8,10,1,2,1]))

    #前面那种列表推导生成式虽然容易理解,但是十分浪费空间
    #真正的快排如下:
    def quick_sort(L):
    #用户传入数组,我们在内部分3个参数实现排序,数组,起始坐标,右坐标
    return sort(L,0,len(L)-1)

    def sort(L,left,right):
    #获取中间值的函数
    if left<right:
    pivot = Partition(L,left,right)
    sort(L,left,pivot-1)
    sort(L,pivot+1,right)
    return L

    def Partition(L,left,right):
    pivot = L[left]

    while left < right:
    while left<right and L[right]>=pivot:
    right -= 1
    L[left] = L[right]
    while left<right and L[left]<=pivot:
    left += 1
    L[right] = L[left]
    #出循环后,left=right,列表被分成围着privot这个数,左小右大的样子
    #需继续对左右两个再做上面的操作
    #对应的下标要改变
    #左:left:0,right:left-1,pivot:L[left]
    #右:left:left+1,right:len(L)-1,pivot:L[left]
    L[left] = pivot#最后把中间值放到中间去
    return left

    L = [5, 9, 1, 11, 6, 7, 2, 4]

    print (quick_sort(L))

     7.桶排序

    def Bucket_Sort(array, bucketsize):
        minValue = min(array)
        maxValue = max(array)
        res = []
        bucketcount = (maxValue - minValue + 1) // bucketsize
        bucket_lists = [[] for i in range(bucketcount)]
        
        for i in array:
            bucket_index = (i - minValue) // bucketsize
            bucket_lists[bucket_index].append(i)
        # 桶内排序
        for j in bucket_lists:
            Quick_Sort_2(j, 0, len(j)-1)    
    
        for j in bucket_lists:
            if len(j) != 0:
                res.extend(j)
        return res

    8.归并排序

    def merge(left, right):
    i, j = 0, 0
    result = []
    while i < len(left) and j < len(right):
    if left[i] <= right[j]:
    result.append(left[i])
    i += 1
    else:
    result.append(right[j])
    j += 1
    result += left[i:]
    result += right[j:]
    return result


    def merge_sort(lists):
    # 归并排序
    if len(lists) <= 1:
    return lists
    num = len(lists) / 2
    left = merge_sort(lists[:num])
    right = merge_sort(lists[num:])
  • 相关阅读:
    mysql分组排序取组内第一的数据行
    C#版Nebula客户端编译
    关于nginx
    http状态码
    gitlab
    TCP/IP 3次握手和四次断开
    nps 内网穿透
    用CentOS7做一个简单的路由器
    linux 简单特效
    LVS粗讲
  • 原文地址:https://www.cnblogs.com/henry2019/p/14422540.html
Copyright © 2020-2023  润新知