快速排序算法在处理不同容量数组时的数据可视化

回忆快速排序:

链接: link

javascript 复制代码
#将不同数据规模数组快排时间可视化
import time
import random
import matplotlib.pyplot as plt
import numpy as np
#三值取中法取轴值
def FindPivox(nums,left,right):
     mid=(left+right)//2
     if nums[left]>nums[mid]:
         nums[left],nums[mid]=nums[mid],nums[left]
     if nums[left]>nums[right]:
         nums[left],nums[right]=nums[right],nums[left]
     if nums[mid]>nums[right]:
         nums[mid],nums[right]=nums[right],nums[mid]
     return mid

def partition(nums,left,right,pivox):
    while left<=right:
        while nums[left]<pivox:
            left+=1
        while nums[right]>pivox and right>0:
            right-=1
        nums[left],nums[right]=nums[right],nums[left]
    nums[left], nums[right] = nums[right], nums[left]
    return left

def quick_sort(nums,left=0,right=None):
    if right is None:
        right=len(nums)-1
    #1、确定恰当的轴值
    p_index1=FindPivox(nums,left,right)
    #2、轴值和右端元素交换位置,方便双指针法分割小值序列和大值序列
    nums[p_index1],nums[right]=nums[right],nums[p_index1]
    #3、双指针法分割小值序列和大值序列
    p_index2=partition(nums,left,right-1,nums[right])
    #4、将轴值元素放在小值元素序列右边,大值元素左边,其实就是左指针元素和轴值交换
    nums[p_index2],nums[right]=nums[right],nums[p_index2]
    #5、递归:(增加条件当数据规模小于时停止递归改用直接插入排序)
    if (p_index2-left)>1:#隐含了基准情形,当序列中元素为1时排序完成
        quick_sort(nums,left,p_index2-1)
    if (right-p_index2)>1:
        quick_sort(nums,p_index2+1,right)
        return nums

#数据可视化

# 生成的规模为volume的整数数组
def generateData(volume,repetitionRate):
    # :param volume:定义生成的数据规模大小,应为整数
    # :param repetitionRate: 需要生成的数据序列的重复率,其值为[0,1]的小数,0代表完全不重复,1代表全部重复
    # :return: 按照要求生成的规模为volume的整数数组
    dataSet = volume - int(repetitionRate*volume)
    if dataSet == 0:
        return [0]*volume
    data = [0]*volume
    for i in range(dataSet):
        data[i] = i
    startIndex = dataSet
    while startIndex < volume:
        for i in range(dataSet):
            data[startIndex] = random.randrange(0,dataSet)
            startIndex += 1
            if startIndex == volume:
                 break
    random.shuffle(data) # 将数据随机打乱
    return data

#运行时间
def elapsedTime(function, volumes):
    # :param function:需要计算运行函数的函数名
    # :param volumes: 记录数据规模大小的数组
    # :return: 记录运行时间的数组
    elapsedTimes = []
    for volume in volumes:
        nums = generateData(volume, 0)
        startTime = time.time_ns()
        function(nums,0,len(nums)-1)
        endTime = time.time_ns()
        elapsedTimes.append(endTime-startTime)
    return elapsedTimes

#可视化,横轴竖轴分别代表,数据规模、运行时间
def getChart(X,Y):
    fig, ax = plt.subplots()#创建一个新的图形窗口和一个坐标轴对象
    ax.plot(X, Y)
    plt.xlabel('Volume')  #指定x轴名称
    plt.ylabel('Elapsed Time')  #指定y轴名称
    plt.yticks(np.arange(0,0.5,0.1))#设置y轴间距
    plt.title('Quick Sort Elapsed Time')  #创建图表名称
    plt.show()
    plt.pause(5)
def main():
    volumes = [10*i for i in range(1,3)]#类型:列表。
    Y = elapsedTime(quick_sort,volumes)
    getChart(volumes, Y)#x:数据规模 y:快速排序所需时间

if __name__ == "__main__":
    main()

输出结果:

要想得到处理大规模数组所需的时间,可以修改

volumes参数

eg

javascript 复制代码
volumes = [100*i for i in range(1,101)]

这样就能得到快排在处理数据规模从100、200...10000的数组所需的时间啦

相关推荐
阳明山水21 分钟前
因果一致性正则化实战解析
人工智能·深度学习·算法·机器学习·架构
黄金龙PLUS1 小时前
5个1024比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密
心中有你02142 小时前
C语言埃氏筛法(素数筛选)
c语言·数据结构·算法
Omics Pro3 小时前
Cell封面|衰老生物学开源AI工具包
数据库·人工智能·算法·机器学习·自然语言处理
IT毕设梦工厂3 小时前
计算机毕业设计选题推荐:基于大数据的购物趋势数据可视化分析系统|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·信息可视化·spark·毕业设计·课程设计·大数据毕设项目
IT毕设梦工厂3 小时前
计算机毕业设计选题推荐:基于大数据的城市尾气排放数据可视化分析|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hive·信息可视化·spark·毕业设计·课程设计·大数据毕设项目
释厄6234 小时前
多黑洞具现论·物理/生物/金融三域显化·虚拟宇宙黑洞·奇点=0 圆圈
开发语言·数据结构·人工智能·程序人生·安全威胁分析
IT毕设梦工厂5 小时前
计算机毕业设计选题推荐:基于大数据的广告投放数据可视化分析系统|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·信息可视化·数据分析·spark·毕业设计·课程设计
UIU1145 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
用户9799848071810 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法