Python实现十种排序算法

排序算法,四种排序的模板实现 四种排序算法的模板实现,将结果输入到文件中,并计算所用时间 立即下载

#%%

冒泡排序

  1. 算法步骤
    比较相邻的元素。如果第一个比第二个大,就交换他们两个。 # # 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 # # 针对所有的元素重复以上的步骤,除了最后一个。 # # 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
def bubbleSort(arr):
    for i in range(1, len(arr)):
        for j in range(0, len(arr)-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr
nums = [1,3,5,7,2,4,6]
print("排序前:" , nums)
# 传递列表副本排序
print("排序后:",bubbleSort(nums[:]))

#%%

选择排序

  1. 算法步骤
    首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 # # 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 # # 重复第二步,直到所有元素均排序完毕。
def selectionSort(arr):
    for i in range(len(arr) - 1):
        # 记录最小数的索引
        minIndex = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[minIndex]:
                minIndex = j
        # i 不是最小数时,将 i 和最小数进行交换
        if i != minIndex:
            arr[i], arr[minIndex] = arr[minIndex], arr[i]
    return arr
print("排序前:" , nums)
# 传递列表副本排序
print("排序后:",selectionSort(nums[:]))

插入排序

  1. 算法步骤 # # 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。 # # 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
def insertionSort(arr):
    for i in range(len(arr)):
        preIndex = i-1
        current = arr[i]
        while preIndex >= 0 and arr[preIndex] > current:
            arr[preIndex+1] = arr[preIndex]
            preIndex-=1
        arr[preIndex+1] = current
    return arr
print("排序前:" , nums)
# 传递列表副本排序
print("排序后:",insertionSort(nums[:]))

希尔排序

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。 # 但希尔排序是非稳定排序算法。 # 1. 算法步骤 # # 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1; # 按增量序列个数 k,对序列进行 k 趟排序; # 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列, # 分别对各子表进行直接插入排序。 # 仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

def shellSort(arr):
    import math
    gap=1
    while(gap < len(arr)/3):
        gap = gap*3+1
    while gap > 0:
        for i in range(gap,len(arr)):
            temp = arr[i]
            j = i-gap
            while j >=0 and arr[j] > temp:
                arr[j+gap]=arr[j]
                j-=gap
            arr[j+gap] = temp
        gap = math.floor(gap/3)
    return arr
print("排序前:" , nums)
# 传递列表副本排序
print("排序后:",shellSort(nums[:]))

归并排序

  1. 算法步骤 # 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列; # 设定两个指针,最初位置分别为两个已经排序序列的起始位置; # 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置; # 重复步骤 3 直到某一指针达到序列尾; # 将另一序列剩下的所有元素直接复制到合并序列尾。
def mergeSort(arr):
    import math
    if(len(arr)<2):
        return arr
    middle = math.floor(len(arr)/2)
    left, right = arr[0:middle], arr[middle:]
    return merge(mergeSort(left), mergeSort(right))

def merge(left,right):
    result = []
    while left and right:
        if left[0] <= right[0]:
            result.append(left.pop(0));
        else:
            result.append(right.pop(0));
    while left:
        result.append(left.pop(0));
    while right:
        result.append(right.pop(0));
    return result
print("排序前:" , nums)
# 传递列表副本排序
print("排序后:",mergeSort(nums[:]))

快速排序

  1. 算法步骤 # 从数列中挑出一个元素,称为 “基准”(pivot); # 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; # 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
def quickSort(arr, left=None, right=None):
    left = 0 if not isinstance(left,(int, float)) else left
    right = len(arr)-1 if not isinstance(right,(int, float)) else right
    if left < right:
        partitionIndex = partition(arr, left, right)
        quickSort(arr, left, partitionIndex-1)
        quickSort(arr, partitionIndex+1, right)
    return arr

def partition(arr, left, right):
    pivot = left
    index = pivot+1
    i = index
    while  i <= right:
        if arr[i] < arr[pivot]:
            swap(arr, i, index)
            index+=1
        i+=1
    swap(arr,pivot,index-1)
    return index-1

def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]
print("排序前:" , nums)
# 传递列表副本排序
print("排序后:",quickSort(nums[:]))

堆排序

大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列; # 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列; # 堆排序的平均时间复杂度为 Ο(nlogn)。 # 1. 算法步骤 # 创建一个堆 H[0……n-1]; # 把堆首(最大值)和堆尾互换; # 把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置; # 重复步骤 2,直到堆的尺寸为 1。

def buildMaxHeap(arr):
    import math
    for i in range(math.floor(len(arr)/2),-1,-1):
        heapify(arr,i)

def heapify(arr, i):
    left = 2*i+1
    right = 2*i+2
    largest = i
    if left < arrLen and arr[left] > arr[largest]:
        largest = left
    if right < arrLen and arr[right] > arr[largest]:
        largest = right

    if largest != i:
        swap(arr, i, largest)
        heapify(arr, largest)

def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]

def heapSort(arr):
    global arrLen
    arrLen = len(arr)
    buildMaxHeap(arr)
    for i in range(len(arr)-1,0,-1):
        swap(arr,0,i)
        arrLen -=1
        heapify(arr, 0)
    return arr
print("排序前:" , nums)
# 传递列表副本排序
print("排序后:",heapSort(nums[:]))

计数排序

def countingSort(arr, maxValue):
    bucketLen = maxValue+1
    bucket = [0]*bucketLen
    sortedIndex =0
    arrLen = len(arr)
    for i in range(arrLen):
        if not bucket[arr[i]]:
            bucket[arr[i]]=0
        bucket[arr[i]]+=1
    for j in range(bucketLen):
        while bucket[j]>0:
            arr[sortedIndex] = j
            sortedIndex+=1
            bucket[j]-=1
    return arr
print("排序前:" , nums)
# 传递列表副本排序
print("排序后:",countingSort(nums[:],7))

基数排序

def RadixSort(a):
    i = 0                                             #初始为个位排序
    n = 1                                           #最小的位数置为1(包含0)
    max_num = max(a)                       #得到带排序数组中最大数
    while max_num > 10**n:              #得到最大数是几位数
        n += 1
    while i < n:
        bucket = {}                             #用字典构建桶
        for x in range(10):
            bucket.setdefault(x, [])    #将每个桶置空
        for x in a:                               #对每一位进行排序
            radix =int((x / (10**i)) % 10)   #得到每位的基数
            bucket[radix].append(x) #将对应的数组元素加入到相应位基数的桶中
        j = 0
        for k in range(10):
            if len(bucket[k]) != 0:       #若桶不为空
                for y in bucket[k]:         #将该桶中每个元素
                    a[j] = y                       #放回到数组中
                    j += 1
        i += 1
    return a   

if __name__ == '__main__':
    a = [12,3,45,3543,214,1,4553]
    print("排序前:" , a)
    # 传递列表副本排序
    print("排序后:",RadixSort(a))

#%%

桶排序

def bucketSort(nums):
    # 选择一个最大的数
    max_num = max(nums)
    # 创建一个元素全是0的列表, 当做桶
    bucket = [0]*(max_num+1)
    # 把所有元素放入桶中, 即把对应元素个数加一
    for i in nums:
        bucket[i] += 1
 
    # 存储排序好的元素
    sort_nums = []
    # 取出桶中的元素
    for j in range(len(bucket)):
        if bucket[j] != 0:
            for y in range(bucket[j]):
                sort_nums.append(j)
 
    return sort_nums
 
nums = [5,6,3,2,1,65,2,0,8,0]
print("排序前:" , nums)
# 传递列表副本排序
print("排序后:",bucketSort(nums))
EMS案例:BMS传导发射超标整改案例 BMS作为新能源汽车的关键部件,其EMC性能直接影响整车的安全性和可靠性。本文通过一个实际的传导发射整改案例,详细展示了从问题定位、分析到解决方案实施的全过程。希望这些经验能够为从事类似产品设计的工程师提供有价值的参考,在未来的产品开发中避免类似问题,设计出更加可靠、稳定的BMS产品。EMC设计是一门结合理论与实践的艺术,只有通过不断积累经验、深入理解电磁场理论,并紧密结合实际应用场景,才能在复杂的电磁环境中设计出鲁棒性强的电子产品。 阅读详情

相关推荐

Fiddler Everywhere保姆级教程:10分钟搞定手机HTTPS抓包(附证书配置避坑指南)

本文提供Fiddler Everywhere移动端HTTPS抓包的保姆级教程,涵盖环境配置、代理设置、证书安装及常见问题排查。重点解析如何正确安装并信任Fiddler根证书以解密HTTPS流量,帮助开发者快速搭建抓包环境,高效分析应用网络行为,提升调试效率。

git9versioner的博客 704

八种排序算法模板

【代码】八种排序算法模板。

laocooon的博客 270

Echats-wordcloud 文字云图的踩坑点【Unknown series wordCloud】

一直都是报 【ECharts Unknown series wordCloud】这玩意可能要刷脸,祝你好运吧~

Sky_Bug的博客 2418

排序算法模板

排序算法

orz_include的博客 277

Codex 命令行高效操作指南

本文详细介绍了Codex命令行工具的高效使用方法,包括安装配置、核心参数解析和实战技巧。通过`codex complete`、`codex explain`等指令,开发者可以快速生成代码、调试错误和重构项目,显著提升开发效率。特别推荐使用`--temperature`和`--max-tokens`参数优化生成结果。

weixin_29201313的博客 530

【顾邦小讲堂】第十九期 RC Snubber吸收电路详解:抑制MOSFET振铃现象与过冲的设计技巧!

通过RC Snubber电路有效抑制MOSFET DS端的过冲及振铃现象,帮助工程师们在设计中提升电路的稳定性和可靠性

GBupupup的博客 3787

十个常用排序算法的原理及python模板

原理:希尔排序,也称缩小增量排序,是插入排序的一种高效改进式版本。与插入排序不同的是,希尔排序是对元素间隔固定的多个子序列分别进行插入排序,随着排序轮数的增加,子序列的长度逐渐缩小,最后变成一个整体有序的序列。原理:从第一个元素开始,将相邻的两个元素进行比较,如果前一个元素大于后一个元素就将它们交换,一轮下来最大的元素就会被交换到最后,再对前面的元素进行相同的操作,直到全部排序完成。原理:将未排序序列中的第一个元素插入到已排序序列中合适的位置,对于未排序序列中的其他元素进行相同的操作,直到全部排序完成。

Kayla_Smith的博客 1020

全球建筑物提取数据集(免费下载):微软/GlobalMLBuildingFootprints

这个是GitHub上的开源数据集: https://github.com/microsoft/GlobalMLBuildingFootprints 介绍 必应地图正在世界各地发布开放式建筑足迹。我们从 2014 年到 2021 年间的 Bing Maps 图像中检测到了 7.77 亿座建筑物,包括 Maxar 和 Airbus 的图像。数据可在 ODbL 下免费下载和使用。该数据集补充了我们的其他版本。 包括的地区 执照 此数据由 Microsoft 根据Open Dat..

此星光明博客 6289

八种排序算法(c++模板实现)------详细注释版

八种排序算法(c++模板实现)------详细注释版 前言 排序算法基本上学过数据结构都是有所学习的,本篇博客不再详细介绍每种算法的基础思想,会直接通过代码及注释的方式展示出算法,方便自己及已经入门同学日常回顾! 概述 排序 种类 内部排序 使用内存 外部排序 内存不够使用需要访问外存,常见算法有:多路归并排序、外分配排序等 内部排序算法种类 排序方式 排序种类 插入排序 直接插入排序、希尔排序 选择排序 简单选择排序、堆排序 交换排序 冒泡排序、快速排序

weixin_48617416的博客 2465

华为OD机试真题2025双机位C卷 Java&Go 实现【统计员工影响力分数】

华为OD机试真题2025双机位C卷 C语言 实现【统计员工影响力分数】假设你是大型科技公司的数据分析师,负责分析公司内部员工的社交网络。你需要编写一个函数来计算每个员工的影响力分数。影响力分数定义为该员工直接和间接影响的员工数量。 输入描述

MISAYAONE的博客 278

YOLO26-Quantized:面向国产AI芯片的全栈量化方案,适配昇腾310P与寒武纪MLU270

在算力国产化替代的行业趋势下,昇腾310P、寒武纪MLU270已成为工业边缘视觉、智能检测场景的主流国产AI芯片选型。针对原生YOLO26模型在国产芯片上推理效率低、算子兼容性差、量化精度塌陷三大核心痛点,本文提出YOLO26-Quantized全栈量化方案,覆盖训练感知量化(QAT)、离线静态量化(PTQ)、模型编译优化、芯片专属部署全流程。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 762

算法之动态规划总结(11种DP类型,70道全部搞懂)

简介 参考文章,将所有的DP问题分成11大类,本文将这些题目的解法进行探讨。所有题目均来自leetcode。 题目 1、线性 DP 最经典单串: 最长上升子序列 最经典双串: 最长公共子序列 经典问题: 三角形最小路径和 最大子序和 乘积最大子数组 鸡蛋掉落(DP+二分) 俄罗斯套娃信封问题 打家劫舍系列: (打家劫舍3 是树形DP) 打家劫舍 打家劫舍 II 股票系列: 买卖股票的最佳时机 买卖股票的最佳时机 II 买卖股票的最佳时机 III 买卖股票的最佳时机 IV

pl0321的博客 13万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

十种排序算法的python实现

冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。适用于数据量较小且基本有序的数列排序。

Sun_Raiser的博客 1385

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

十种经典的排序算法的python实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、涉及的排序算法二、代码主代码调用方式、示例总结 前言 以下是十种经典排序算法的python代码展示,现已将代码封装为类,有错误的地方希望大家批评指正呀,大家共同探讨共同成长,加油加油!! 一、涉及的排序算法 十种经典的排序算法分别是:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序和基数排序。(具体的介绍就不详细说明了,这位博主有很详细的介绍 (https://blog.csdn.n.

weixin_42377816的博客 1248

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

python实现十种排序算法

之前用java写算法和数据结构的时候就说过到时候也要试试用其他语言实现一下,今天刚好旅游回家,许久没写代码拿这个来熟悉恢复一下。 直接上代码,各种算法的介绍可以参考其他博客 import math #1.冒泡排序 def bubbleSort(arr): for i in range(1,len(arr)): for j in range(0,len(arr)-i): ...

shelgi的博客 418

Python实现十种经典排序算法

1、冒泡排序 基本思想:一次只比较两个元素,算法的时间复杂度为O(n2)O(n^2)O(n2) def bub_sort(lists): n = len(lists) for i in range(n): for j in range(1,n-1): if lists[j-1] > lists[j]: l...

Chauncy的博客 1076

python实现堆排序用类的方法_GitHub - lil-q/sorting-algorithm-python: 十种排序算法的python实现及复杂度分析...

排序分类评价排序算法的几个指标:时间复杂度:包括平均时间复杂度、最坏时间复杂度和最好时间复杂度。一般而言,好的性能是$$O(nlog_2n)$$,坏的性能是$$O(n^2)$$。对于一个排序理想的性能是O(n),但平均而言不可能达到。基于比较的排序算法对大多数输入而言至少需要$$O(nlog_2n)$$。空间复杂度:内存使用量稳定性: 稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一...

weixin_39700397的博客 186

算法基础——十种常用排序算法的Java及Python实现

概述 八大排序算法不用多说了,程序员算法基础必须要掌握的,现在总结一下加深记忆。下图是这八大排序算法的分类、名称、时间空间复杂度,以及稳定性。 代码 以下是经典八大排序算法的Java及Python代码,都是基于经典算法书籍《算法导论》里的伪代码实现的,我在关键语句部分附上了注释。 按照上图中的顺序分别介绍八大排序算法的实现,前面是Java,后面是Python。Java的排序函数写在

buptlrw的专栏 2036

python十种排序代码截图_一起来用python实现一下十大经典排序算法呀

原文链接一起来用python实现一下十大经典排序算法呀​mp.weixin.qq.com前言既然之前很多小伙伴反应希望公众号多发点算法类的文章,那就来呗。先从简单的入手好了,带大家用python来实现一波十大经典排序算法呗。分别是:冒泡排序;选择排序;插入排序;希尔排序;归并排序;快速排序;堆排序;计数排序;桶排序;基数排序。废话不多说,让我们愉快地开始吧~冒泡排序基本原理比较类排序算法。算法描述...

weixin_32817047的博客 92

python实现排序算法_十大经典排序算法的python实现

十种常见排序算法可以分为两大类:非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。包括:冒泡排序、选择排序、归并排序、快速排序、插入排序、希尔排序、堆排序等。线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。包括:计数排序、桶排序、基数排...

weixin_39706561的博客 91

Python十种排序算法

快速排序是一种基于分治思想的排序算法,它通过选择一个基准元素将待排序序列划分成两个子序列,其中一个子序列的所有元素都比基准元素小,另一个子序列的所有元素都比基准元素大,然后对这两个子序列分别进行递归排序,最后将已有序的子序列合并成一个有序的序列。基数排序是一种基于非比较整数排序的算法,它通过将待排序序列中的元素按照位数切割成不同的桶,然后对每个桶中的元素进行计数排序,最后根据每个元素的位数将各个桶中的元素按顺序合并。桶排序的平均时间复杂度为O(n+k),其中n为待排序序列的长度,k为序列中不同元素的个数。

weixin_41312759的博客 1296

【数据结构与算法】排序算法:一次学懂十大排序算法!

排序算法用于对数据按照升序或降序进行排列。本文总结了常见的十种排序算法,并基于Python进行详细的实现。

qq_57161038的博客 605

十大经典排序算法+Python实现

文章目录0. 算法简述0.1 算法分类0.2 算法复杂度0.3 相关概念0.4 例子说明1. 冒泡排序 0. 算法简述 0.1 算法分类 这里整理的十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行...

CD_Don的博客 3514

十大排序算法总结(Python3实现)

目录 一、概述 二、算法简介及代码展示 1.冒泡排序 2.简单选择排序 3.简单插入排序 4.堆排序 5.快速排序 6.希尔排序 7.归并排序 8.计数排序 9.桶排序 10.基数排序 11.#代码说明 三、感悟总结 一、概述 排序算法大概是hello world之后最经典的编程题目了,但这并不意味着简单如hello world一样的输入输出。排序的各种解决方...

aiya_aiya_的博客 1万+

Python——常见排序算法解析

非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

m0_59485658的博客 794
上一篇: VSCode安装Code Runner编译C/C++重定向+指定exe生成位置
下一篇: VSCode 设置Snippets代码块
ArtinCode
博客等级 码龄9年 23粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值