排序算法的原理与手写代码

2023-10-27

本文从三个方面阐述这十种经典的排序算法,分别是:

    A、算法的性质

    B、代码的实现

    C、算法的实用性与适用范围

以下是详细的说明

A、算法的性质

1、选择排序
        1、原理
            每次都选择数组中最小的数,将其依次从第零个放入,直到最后。
        2、属性
            时间复杂度:由于每次都会遍历一遍数组,选出最小的数据。假设有n个数据,则总共需要比对n²。也就是平均复杂度为n²,同理最坏情况下也是如此。
                那么,最好的情况呢?其实也是,原因为,即使是顺序排列,按照原理可知,也需要两个循环。
            空间复杂度:不会暂用其他空间,只要本数组即可,即为1。
            稳定性:为不稳定。
                用数组5,8,5,2,9的例子解释。第一次,选择2为最小值,其与第零位的5交换位置,那么,排序后两个五的相对位置与排序前的
                    相对位置就产生了变化。即为不稳定的

    2、快速排序
        1、原理
            选择第一个数作为基数,比它小的放左边,比它大的放右边,完成一轮对比之后,以基数作为分界线,左右两边两组数据,再用同样的方法排序
                直到最终排序完成
        2、属性
            时间复杂度:平均的时间复杂度为O(nlogn),最好的情况也是如此,最坏的情况是n²
            空间复杂度:虽然递归的时候会存一些数据,但是,总体还是在常数级。再者它只需要在自身的数组中交换数据,不需要额外开辟空间
            稳定性:为不稳定
                这个很好理解,就拿两个相同的数来说,在比对、交换的过程中,他们之间的相对位置肯定会被改变。
        3、其他
            快速排序的理论核心在于与基数的比对,然后产生两组特别数据,然后对这两组是数据进行与上个步骤相同的处理
            既然都为相同操作,那么就用用到递归,在代码上要特别注意递归的使用,所以引入begin与end是非常好的操作。

    3、插入排序
        1、原理
            可以看作是把一个数据插入到一个有序数据中,一般都是从后面插入。
            从第一个开始,它已经是有序数据了,将他与第二个进行比较,假如大于后者,则把后者插入到前面。
        2、属性 
            时间复杂度:由于它也是两曾循环,所以平均复杂度肯定是n²,最坏的情况也是如此。最好的情况则是排好顺序的数据,则第二层循环用不上
                不需要移动数据,所以为n
            空间复杂度:不会暂用其他空间,只要本数组即可,即为1。
            稳定性:为稳定 
                因为插入的原则是,当两个数据相同时,不用处理,也就是不用插入到前一个数据的前面,那么他们的相对位置就没有任何变化。
        3、其他
            我在实现插入排序时,把问题复杂化了,用了很多变量来表示,结果越来越乱。解决问题的关键在于要插入的数据与它的编号。然后根据编号
                向左移动,此时的移动用一个while循环做,判断的条件是插入数据大于它的前一个数据。
    4、希尔排序
        1、原理 
            插入排序的进阶版。
            按照一定的间隔h,选取一个数据,组成一组新的数组,相应的会产生h组数据,然后对这些数组使用插入排序。
            然后,使用二分之h作为间隔,重复上述步骤,直到h等于1。这种排序方式为希尔排序
        2、属性
            时间复杂度:平均时间复杂度为O(n的1.3次方),最后的情况是n,最差的情况是n²
            空间复杂度:不会暂用其他空间,只要本数组即可,即为1。
            稳定性:为不稳定
                这个很好理解,按照一定的间隔取了数据之后,原来的相对关系肯定被改变了。
        3、其他
            while leftCnt > (begin - gap) and ShMatrix[leftCnt] > insertValue:
            这句特别关键,leftCnt大于的数值是从开始的位置往左边移动对应间隔的距离。

    5、冒泡排序
        1、原理
            从第一二个数开始比较,较大的数放后面,然后再第二三个数进行比较,较大的数放后面,一直比较到最后一个数
            所以,数组中最大的数就像冒泡的样子,移到了最后。这便是第一轮操作。
            同理,第二轮操作与第一轮一模一样。
        2、属性 
            时间复杂度:由于有两层循环,所以,平均时间复杂度为O(n²),最坏的情况也是如此
                最好的情况是已经排好序了,所以只要一层循环就够了。
            空间复杂度:不会暂用其他空间,只要本数组即可,即为1。
            稳定性:为稳定
                因为在冒泡的过程中,是两者进行大小比对,不会改变数据的相对位置
        3、其他
            1、冒泡排序相对简单,但是可以参考别的大神用非常简洁的方式实现这套算法。
            2、内层循环与外层循环要相互“独立”,互相直接尽量不要牵扯。这样的目的是使算法更简单明了,也不易出错
            3、用外层循环的次数控制内层循环

B、代码的实现

    1、代码实现使用的语言为python,因为其简单易上手。

    2、结合第一部分的原理与代码的注释,应该很好理解代码。通过参考代码也可以进一步加深对算法的理解。

import random 
import time 
import datetime

QuComparision = 0
QuExchange = 0

HeComparision = 0
HeExchange = 0

########################################################################
# Get an array whose elements are unordered integers
def RandomInitList(start, end, length):
    randomList = []
    for i in range(length):
        randomList.append(random.randint(start, end))
    
    # print("The automatically generated unordered array data is:")
    # print(randomList)
    
    return randomList

########################################################################
# Choose a sorting method
def SelectionSort(SeMatrix):
    timeStart = time.time()
    comparision = 0
    exchange = 0
    exNum = 0
    inNum = 0

    while exNum < len(SeMatrix):
        minValue = SeMatrix[exNum]
        inNum = exNum

        while inNum < len(SeMatrix):
            if minValue > SeMatrix[inNum]:
                comparision = comparision + 1
                exchange = exchange + 1
                minTemp = minValue
                minValue = SeMatrix[inNum]
                SeMatrix[inNum] = minTemp
            inNum = inNum + 1

    
        exchange = exchange + 1
        SeMatrix[exNum] = minValue
        exNum = exNum + 1

    timeEnd = time.time()
    timeStart = int(round(timeStart * 1000))
    timeEnd = int(round(timeEnd * 1000))
    timeGap = timeEnd - timeStart

    #print("The result of selecting sort is:")
    #print(SeMatrix)
    print("Select comparision number:%d" % comparision)
    print("Select exchange number:%d" % exchange)
    print("timeGap:%dms" % timeGap)

    return SeMatrix

########################################################################
# Quickly sorted method calls
def QuickSortMathod(left, right, QuMatrix):
    global QuComparision
    global QuExchange
    comparision = 0
    exchange = 0
    begin = left
    end = right

    if left > right:
        return

    while left != right:
        QuComparision = QuComparision + 1
        if QuMatrix[right] <= QuMatrix[begin]:
            QuComparision = QuComparision + 1
            if QuMatrix[left] > QuMatrix[begin]:
                QuComparision = QuComparision + 1
                QuExchange = QuExchange + 1
                quickTemp = QuMatrix[left]
                QuMatrix[left] = QuMatrix[right]
                QuMatrix[right] = quickTemp

                right = right - 1
            else:
                left = left + 1
        else:
            right = right - 1
    
    QuExchange = QuExchange + 1
    quickTemp = QuMatrix[begin]
    QuMatrix[begin] = QuMatrix[right]
    QuMatrix[right] = quickTemp

    QuickSortMathod(begin, (left - 1), QuMatrix)
    QuickSortMathod((right + 1), end, QuMatrix)

# Quickly sorted method
def QuickSort(QuMatrix):
    timeStart = time.time()

    global QuComparision
    global QuExchange
    QuickSortMathod(0, (len(QuMatrix) - 1), QuMatrix)
        
    timeEnd = time.time()
    timeStart = int(round(timeStart * 1000))
    timeEnd = int(round(timeEnd * 1000))
    timeGap = timeEnd - timeStart
    #print("The result of quick sort is:")
    #print(QuMatrix)
    print("Quick comparision number:%d" % QuComparision)
    print("Quick exchange number:%d" % QuExchange)
    print("timeGap:%dms" % timeGap)

    return QuMatrix

########################################################################
def InsertSort(InMatrix):
    timeStart = time.time()
    comparision = 0
    exchange = 0
    rightCnt = 1
    while rightCnt < len(InMatrix):
        comparision = comparision + 1
        if InMatrix[rightCnt] < InMatrix[rightCnt-1]:
            comparision = comparision + 1
            insertValue = InMatrix[rightCnt]
            leftCnt = rightCnt - 1
            while leftCnt > -1 and insertValue < InMatrix[leftCnt]:
                comparision = comparision + 1
                exchange = exchange + 1
                InMatrix[leftCnt+1] = InMatrix[leftCnt] 
                leftCnt = leftCnt - 1
            exchange = exchange + 1
            InMatrix[leftCnt+1] = insertValue

        rightCnt = rightCnt + 1
    
    timeEnd = time.time()
    timeStart = int(round(timeStart * 1000))
    timeEnd = int(round(timeEnd * 1000))
    timeGap = timeEnd - timeStart
    #print("The result of insert sort is:")
    #print(InMatrix)
    print("Insert comparision number:%d" % comparision)
    print("Insert exchange number:%d" % exchange)
    print("timeGap:%dms" % timeGap)

    return InMatrix

########################################################################
def ShellSort(ShMatrix):
    timeStart = time.time()

    comparision = 0
    exchange = 0
    gap = int((len(ShMatrix) / 2))
    
    while gap > 0:
        begin = 0
        # Set each data loop
        while begin < gap:
            rightCnt = begin + gap

            # Sorting of each group of data after separation by gaps
            while rightCnt < len(ShMatrix):
                if ShMatrix[rightCnt] < ShMatrix[rightCnt - gap]:
                    comparision = comparision + 1
                    leftCnt = rightCnt - gap
                    insertValue = ShMatrix[rightCnt]
                    while leftCnt > (begin - gap) and ShMatrix[leftCnt] > insertValue:
                        comparision = comparision + 1
                        ShMatrix[leftCnt + gap] = ShMatrix[leftCnt]
                        exchange = exchange + 1
                        leftCnt = leftCnt - gap
                    ShMatrix[leftCnt + gap] = insertValue

                rightCnt = rightCnt + gap
            begin = begin + 1
        gap = int((gap / 2))

    timeEnd = time.time()
    timeStart = int(round(timeStart * 1000))
    timeEnd = int(round(timeEnd * 1000))
    timeGap = timeEnd - timeStart
    #print("The result of shell sort is:")
    #print(ShMatrix)
    print("Shell comparision number:%d" % comparision)
    print("Shell exchange number:%d" % exchange)
    print("timeGap:%dms" % timeGap)

    return ShMatrix

########################################################################
def BubbleSort(BuMatrix):
    timeStart = time.time()
    comparision = 0
    exchange = 0

    exCnt = 0
    while exCnt < len(BuMatrix):
        inCnt = 0
        while (inCnt + 1) < (len(BuMatrix) - exCnt):
            if BuMatrix[inCnt] > BuMatrix[inCnt+1]:
                exchange = exchange + 1
                BuTemp = BuMatrix[inCnt+1]
                BuMatrix[inCnt+1] = BuMatrix[inCnt]
                BuMatrix[inCnt] = BuTemp
            inCnt= inCnt + 1
            comparision = comparision + 1

        exCnt = exCnt + 1
    
    timeEnd = time.time()
    timeStart = int(round(timeStart * 1000))
    timeEnd = int(round(timeEnd * 1000))
    timeGap = timeEnd - timeStart
    #print("The result of bubble sort is:")
    #print(BuMatrix)
    print("Bubble comparision number:%d" % comparision)
    print("Bubble exchange number:%d" % exchange)
    print("timeGap:%dms" % timeGap)

########################################################################
def HeapSortOne(HeMatrix):
    timeStart = time.time()
    global HeComparision
    global HeExchange
    constructionCnt = 0

    while constructionCnt < len(HeMatrix):
        # Get the first non-leaf node
        begin = (int((len(HeMatrix)-constructionCnt) / 2) - 1)
        HeMatrix = ConstructionHeap(HeMatrix, begin, constructionCnt)
        # Each time a large top pile is constructed, the number of participating structures is reduced next time
        constructionCnt = constructionCnt + 1
        
        HeMatrix = SwapValue(HeMatrix, 0, (len(HeMatrix) - constructionCnt))
    
    timeEnd = time.time()
    timeStart = int(round(timeStart * 1000))
    timeEnd = int(round(timeEnd * 1000))
    timeGap = timeEnd - timeStart
    #print("The result of heap sort is:")
    #print(HeMatrix)
    print("Heap comparision number:%d" % HeComparision)
    print("Heap exchange number:%d" % HeExchange)
    print("timeGap:%dms" % timeGap)
    
    return HeMatrix

# Constructing a Big Top Binary Tree
def ConstructionHeap(HeMatrix, begin, constructionCnt):
    global HeComparision
    global HeExchange
    # Get the starting non-leaf node
    noLeafNodeCnt = begin

    while noLeafNodeCnt >= 0:
        # Determine if there is a left child
        if (noLeafNodeCnt * 2 + 2) < (len(HeMatrix) - constructionCnt):
            if HeMatrix[noLeafNodeCnt*2+1] > HeMatrix[noLeafNodeCnt*2+2]:
                HeMatrix = SwapMax(HeMatrix, noLeafNodeCnt, noLeafNodeCnt*2 + 1)
            else:
                HeMatrix = SwapMax(HeMatrix, noLeafNodeCnt, noLeafNodeCnt*2 + 2)
        else:
            # Compare directly with right child
            HeMatrix = SwapMax(HeMatrix, noLeafNodeCnt, noLeafNodeCnt*2 + 1)
        
        HeComparision = HeComparision + 1
        HeExchange = HeExchange + 1

        noLeafNodeCnt = noLeafNodeCnt - 1

    return HeMatrix

def SwapMax(HeMatrix, large, small):
    if HeMatrix[large] < HeMatrix[small]:
        temp = HeMatrix[large]
        HeMatrix[large] = HeMatrix[small]
        HeMatrix[small] = temp
    return HeMatrix

def SwapValue(HeMatrix, left, right):
    temp = HeMatrix[left]
    HeMatrix[left] = HeMatrix[right]
    HeMatrix[right] = temp

    return HeMatrix


########################################################################
if __name__ == "__main__":
    Matrix = []
    Matrix = RandomInitList(1, 1000, 800)

    SeMatrix = Matrix.copy()
    QuMatrix = Matrix.copy()
    InMatrix = Matrix.copy()
    ShMatrix = Matrix.copy()
    BuMatrix = Matrix.copy()
    HeOneMatrix = Matrix.copy()
    HeTwoMatrix = Matrix.copy()
    
    # Select Sort
    #SelectionSort(SeMatrix)

    # Quick Sort
    QuickSort(QuMatrix)

    # Insert Sort
    #InsertSort(InMatrix)
    
    # Shell Sort
    ShellSort(ShMatrix)

    # Bubble Sort
    #BubbleSort(BuMatrix)

    # Heap Sort
    HeapSortOne(HeOneMatrix)
    #HeapSortTwo(HeTwoMatrix)

C、算法的实用性与适用范围

此部分待更新,我也正在学习中,等理解透彻了,一定不忘分享

谢谢阅读,希望对你有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法的原理与手写代码 的相关文章

  • 使用python查找txt文件中字母出现的次数

    我需要从 txt 文件中读取该字母并打印 txt 文件中出现的次数 到目前为止 我已经能够在一行中打印内容 但计数有问题 有人可以指导吗 infile open grades txt content infile read for char
  • 稀有对象的 python 类型注释,例如 psycopg2 对象

    我了解内置类型 但是我如何指定稀有对象 例如数据库连接对象 def get connection and cursor gt tuple psycopg2 extensions cursor psycopg2 extensions conn
  • 多处理中的动态池大小?

    有没有办法动态调整multiprocessing Pool尺寸 我正在编写一个简单的服务器进程 它会产生工作人员来处理新任务 使用multiprocessing Process对于这种情况可能更适合 因为工作人员的数量不应该是固定的 但我需
  • 按边距(“全部”)值列对 Pandas 数据透视表进行排序

    我试图根据 pandas 数据透视表中的行总和对最后一列 边距 aggrfunc 进行降序排序 我知道我在这里错过了一些简单的东西 但我无法弄清楚 数据框 数据透视表 WIDGETS DATE 2 1 16 2 2 16 2 3 16 Al
  • 在Python中从大文件中搜索单词列表

    我是新蟒蛇 我有一个单词列表和一个非常大的文件 我想删除文件中包含单词列表中的单词的行 单词列表按排序给出 并且可以在初始化期间输入 我正在努力寻找解决这个问题的最佳方法 我现在正在进行线性搜索 这花费了太多时间 有什么建议么 您可以使用i
  • 从 Azure ML 实验中访问 Azure Blob 存储

    Azure ML 实验提供了通过以下方式读取 CSV 文件并将其写入 Azure Blob 存储的方法 Reader and Writer模块 但是 我需要将 JSON 文件写入 blob 存储 由于没有模块可以执行此操作 因此我尝试在Ex
  • 协程从未被等待

    我正在使用一个简单的上下文管理器 其中包含一个异步循环 class Runner def init self self loop asyncio get event loop def enter self return self def e
  • 在 python pandas 中,如何保存“网格图”?

    我对 pandas 绘图工具很陌生 在文档中 以下命令非常方便 myplot rts ret hist bins 50 by rts primary mic 然而 当我尝试从图中获取图形参考并保存它时 问题就出现了 myfigure myp
  • 给定一个排序数组,就地删除重复项,使每个元素仅出现一次并返回新长度

    完整的问题 我开始在线学习 python 但对这个标记为简单的问题有疑问 给定一个排序数组 就地删除重复项 使得每个 元素只出现一次并返回新的长度 不分配 另一个数组的额外空间 您必须通过修改输入来完成此操作 数组就地 具有 O 1 额外内
  • Airflow 1.9 - 无法将日志写入 s3

    我在 aws 的 kubernetes 中运行气流 1 9 我希望将日志发送到 s3 因为气流容器本身的寿命并不长 我已经阅读了描述该过程的各种线程和文档 但我仍然无法让它工作 首先是一个测试 向我证明 s3 配置和权限是有效的 这是在我们
  • Python 中维基百科 API 中的 DisambiguationError 和 GuessedAtParserWarning

    我想获得维基百科与搜索词相关的可能且可接受的名称列表 在这种情况下是 电晕 当输入以下内容时 print wikipedia summary Corona 这给出了以下输出 home virej local lib python3 8 si
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • XPath:通过当前节点属性选择当前和下一个节点的文本

    首先 这是从我之前的问题 https stackoverflow com questions 5202187 xpath select current and next nodes text by current node attribut
  • 为什么 __dict__ 和 __weakref__ 类从未在 Python 中重新定义?

    类创建似乎从来没有re 定义 dict and weakref class属性 即 如果它们已经存在于超类的字典中 则它们不会添加到其子类的字典中 但始终re 定义 doc and module class属性 为什么 gt gt gt c
  • 使用 PIL 在 Tkinter 中显示动画 GIF

    我正在尝试制作一个程序来使用 Tkinter 显示动画 GIF 这是我最初使用的代码 from future import division Just because division doesn t work right in 2 7 4
  • 带 Flask 的 RPI dht22:无法将第 4 行设置为输入 - 等待 PulseIn 消息超时

    我正在尝试制作一个 Raspberry Pi 3 REST API 使用 DHT22 提供温度和湿度 整个代码 from flask import Flask jsonify request from sds011 import SDS01
  • 如何获取pandas中groupby对象中的组数?

    我想知道有多少个独特的组需要执行计算 给定一个名为 groupby 的对象dfgroup 我们如何找到组的数量 简单 快速 Pandaic ngroups 较新版本的 groupby API pandas gt 0 23 提供了此 未记录的
  • 如何使用 python 定位和读取 Data Matrix 代码

    我正在尝试读取微管底部的数据矩阵条形码 我试过libdmtx http libdmtx sourceforge net 它有 python 绑定 当矩阵的点是方形时工作得相当好 但当矩阵的点是圆形时工作得更糟 如下所示 另一个复杂问题是在某
  • IndexError - 具有匀称形状的笛卡尔 PolygonPatch

    我曾经使用 shapely 制作一个圆圈并将其绘制在之前填充的图上 这曾经工作得很好 最近 我收到索引错误 我将代码分解为最简单的操作 但它甚至无法执行最简单的循环 import descartes import shapely geome
  • 定义在文本小部件中双击时选择哪些字符

    在 Windows 上 双击文本小部件中的单词也将选择连接的标点符号 有什么方法可以定义您想要选择的角色吗 tcl wordchars该变量的值是一个正则表达式 可以设置它来控制什么被视为 单词 字符 例如 通过双击 Tk 中的文本来选择单

随机推荐

  • sql计算字符串类型是时间差

    需要用MySQL计算时间差 使用TIMESTAMPDIFF DATEDIFF 记录一下实验结果 1 默认计算天数 select datediff 2020 09 08 23 59 00 2020 09 10 00 00 00 select
  • 全国计算机vfp是什么,计算机二级VFP数据库简介

    计算机二级VFP数据库简介 引导语 数据库是按照数据结构来组织 存储和管理数据的仓库 以下是百分网小编分享给大家的计算机二级VFP数据库简介 欢迎阅读 一 什么是数据库 我们举个例子来说明这个问题 每个人都有很多亲戚和朋友 为了保持与他们的
  • 微信小程序开发者工具详解

    一 微信小程序web开发工具下载地址 1 1 在微信公众平台 小程序里边去下载开发工具下载地址 1 2 下载后安装一下就可以使用了 二 创建项目 2 1 微信小程序web开发工具需要扫码登陆 所以必须先绑定开发者才可以 2 2 已经绑定的开
  • windows测试工具—SNMP Server测试工具

    概述 告警专项测试时需要在第三方管理软件上查看阵列的故障告警是否正确上报显示及恢复 因此本文档总结采用的第三方管理软件MIB Browser软件的安装 配置 和阵列连接后在MIB Browser上怎么查看告警等内容 以指导进行告警专项测试的
  • java集合知识点汇总

    集合和数组的区别 数组只能存放基本数据类型和引用类型 集合只能存放引用类型 数组是固定长度 集合是可变长度 集合框架API Collection List ArrayList Vector LinkedList Set HashSet Li
  • 变长模板:进阶

    在C 11中 标准定义了7种参数包可以展开的位置 表达式 初始化列表 基类描述列表 类成员初始化列表 模板参数列表 通用属性列表 lambda函数的捕捉列表 语言的其他 地方 则无法展开参数包 我们还可以声明一些有趣的包扩展表达式 扩展1
  • python学习笔记---Python基础【廖雪峰】

    Python基础 数据类型和变量 整数 对于很大的数 例如10000000000 很难数清楚0的个数 Python允许在数字中间以 分隔 因此 写成10 000 000 000和10000000000是完全一样的 十六进制数也可以写成0xa
  • 【无标题】VMware开启虚拟机提示此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态。

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 前言 最近新装一台主机 安装VMware后开机时遇到无法开启 其实遇到这个问题 我们只需要进主板BIOS中 开启Intel Virtualization Technology
  • matlab批量读取并处理.csv文件

    matlab批量读取并处理 csv文件 在fpga数据处理时往往要对ila的输出的大量csv文件进行分析 而手动一个一个文件的导入处理太过麻烦 因而笔者编写了一段matlab代码可以对csv文件进行批量处理 clear clc close
  • JMeter获取登录cookies

    玩过JMeter的都知道 在JMeter请求的时候非登录接口都是需要依赖cookies的 如果把cookies写死 切换登陆账号之后又需要修改cookies 这里想把每一次登录的cookies都获取成最新的 在网上也看过用各种方式去进行获取
  • 【TensorFlow】猫狗大战——二分类

    Code kevin28520 cats vs dogs https blog csdn net caicai2526 article details 75329812 https blog csdn net caicai2526 arti
  • Jenkins与Github集成 webhook配置

    Jenkins与Github集成 Jenkins目前是手动进行项目构建的 如何才能做到Github并持续集成呢 配置前要求 1 Jenkins已经安装Github插件 2 Jenkins服务器已经拥有一个公网IP地址 第一步 配置Jenki
  • ImportError: This version of TensorFlow Datasets requires TensorFlow version >= 2.1.0

    ImportError This version of TensorFlow Datasets requires TensorFlow version gt 2 1 0 Detected an installation of version
  • sublime text3自定义代码补全模板

    模拟案例 拟实现在 HTML 文件中输入cmt 再按TAB键即可自动补全注释代码块 如下 自动补全注释代码 示例 解决方案 首先在 Sublime Text 中安装以下插件 已装请略 Package Control Emmet Packag
  • CMake错误:“Cannot specify sources for target “xxx“ which is not built by this project.”

    描述 运行cmake时候 出现该错误 原因 在没有定义目标前 先链接了一些库或其他元素到该目标上 cmake找不到目标 解决方法 首先定义目标 然后链接库 比如首先添加add library或add executable 然后添加targe
  • 如何关闭端口防止病毒与黑客入侵

    如何关闭端口防止病毒与黑客入侵 你的系统是不是1XP SP1 但是安装了2005瑞星杀毒软件后总是提示系统有 MS 4011 Exploit 和Blaster Rpc Exploit 两个漏洞 最直接的办法 把系统不用的端口都关闭掉 然后从
  • 爬虫入门基础-Selenium反爬(taobao)

    1 淘宝反爬 淘宝的反爬机制是非常完善的 在用selenium登陆淘宝的时候发现淘宝能检测到并弹出滑块 然后无论怎么滑动都通过不了 在经过一番搜索后发现很多网站对selenium都有检测机制 如检测是否存在特有标识 cdc asdjflas
  • cocos creator长列表优化之超出显示区域的隐藏,优化scrollView 列表,Grid列表,通过显示隐藏的方式优化DrawCall,可通用

    版本 cocos creator3 3 2 这里我把mask打开 看看效果 长列表优化 隐藏区域外的 20220411 161150 长列表优化一直是游戏优化的重点内容 特别是在真机上 排行榜 背包等等的数据 渲染太多 导致drawCall
  • TCP/IP网络编程 - 基础学习

    1 创建Socket include
  • 排序算法的原理与手写代码

    本文从三个方面阐述这十种经典的排序算法 分别是 A 算法的性质 B 代码的实现 C 算法的实用性与适用范围 以下是详细的说明 A 算法的性质 1 选择排序 1 原理 每次都选择数组中最小的数 将其依次从第零个放入 直到最后 2 属性 时间复