zoukankan      html  css  js  c++  java
  • 常用算法

    一、算法(Algorithm):一个计算过程,解决问题的方法

    二、衡量程序好坏的标准可以通过时间复杂度和空间复杂度

    三、时间复杂度:是用来估计算法运行时间的一个式子(单位)。

    一般来说,时间复杂度高的算法比复杂度低的算法慢。

    常见的时间复杂度(按效率排序) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)

    不常见的时间复杂度(看看就好) O(n!) O(2n) O(nn) …

    如何一眼判断时间复杂度?

    循环减半的过程O(logn)

    几次循环就是n的几次方的复杂度

    四、空间复杂度:用来评估算法内存占用大小的一个式子

    空间换时间

    五、排序算法

    1、冒泡排序

    # 时间复杂度是: O(n^2)
    # 空间复杂度是: O(1)
    def BubbleSort(li):
        for i in range(len(li)):    # i = 0
            flag = True
            for j in range(len(li) - i - 1):   # j = 0, j = 1, j =2
                if li[j] > li[j+1]:            # li[0]=1 > li[1]=2 | li[1]=2 > li[2]=3 | li[2] > li[3]
                    li[j], li[j+1] = li[j+1], li[j]
                    flag = False
            if flag:
                return None

    2、选择排序

    # 时间复杂度是:O(n^2)
    # 空间复杂度是:O(1)
    def SelectSort(li):
        for i in range(len(li)):
            minLoc = i
            for j in range(i + 1, len(li)):
               if li[j] < li[minLoc]:
                    li[j], li[minLoc] = li[minLoc], li[j]

    3、插入排序

    # 时间复杂度:O(n^2)
    # 空间复杂度;O(1)
    def InsertSort(li):
        for i in range(1, len(li)):
            tmp = li[i]    # i=2, tmp = 4
            j = i - 1      # j = 1
            while j >= 0 and li[j] > tmp:   # li[1] = 7 > tmp = 4 | li[0]=5 > tmp=4
                li[j+1] = li[j]             #  j = 1
                j = j - 1                   # j = 0  | j = -1
    
            li[j + 1] = tmp  # li[0] = tmp = 4

    4、快速排序

    # 时间复杂度: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 = left + 1
            li[right] = li[left]
        li[left] = tmp
        return left
    
    def Quick_Sort(li, left, right):
        if left < right:
            mid = partition(li, left, right)  # O(n)
            Quick_Sort(li, left, mid-1)      #  O(logn)
            Quick_Sort(li, mid+1,right)

    5、归并排序

    # 时间复杂度:O(nlogn)
    # 空间复杂度:O(n)
    # python 底层 sorted()函数, 采用的排序算法是 TimSorted 包含了归并排序和插入排序
    # TimSorted 的时间复杂度是:O(nlogn)
    def merge(li, low, mid, high):
        i = low
        j = mid + 1
        ltmp = []
        while i <= mid and j <= high:
            if li[i] <= li[j]:
                ltmp.append(li[i])
                i += 1
            else:
                ltmp.append(li[j])
                j += 1
        while i <= mid:
            ltmp.append(li[i])
            i += 1
        while j <= high:
            ltmp.append(li[j])
            j += 1
        li[low:high+1] = ltmp
    
    def mergeSort(li, low, high):
        if low < high:
            mid = (low+high) // 2
           # 分解
            mergeSort(li, low, mid)  ### O(logn)
            mergeSort(li, mid+1, high)
            print('分解后:',li[low:high + 1])
            # 合并
            merge(li, low, mid, high)
            print('合并后:', li[low:high + 1])

     

  • 相关阅读:
    CentOS6下OpenLDAP+PhpLdapAdmin基本安装及主从/主主高可用模式部署记录
    Curl运维命令
    kafka 基础知识梳理及集群环境部署记录
    RocketMQ 简单梳理 及 集群部署笔记
    Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)
    Redis+Keepalived高可用环境部署记录
    Centos下Nodejs+npm环境-部署记录
    基于Ping和Telnet/NC的监控脚本案例分析
    linux dig 命令使用方法
    dnsjava usage
  • 原文地址:https://www.cnblogs.com/zhangguosheng1121/p/11503063.html
Copyright © 2011-2022 走看看