十大经典排序算法

2023-05-16

原文地址:一文搞掂十大经典排序算法_不才伟才的博客-CSDN博客

一文搞掂十大经典排序算法
今天整理一下十大经典排序算法。

1、冒泡排序
——越小的元素会经由交换慢慢“浮”到数列的顶端

算法演示


算法步骤
比较相邻的元素。如果第一个比第二个大,就交换它们两个;
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
针对所有的元素重复以上的步骤,除了最后一个;
重复步骤1~3,直到排序完成。
算法实现
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

2、选择排序
—— 最小的出来排第一,第二小的出来排第二…

算法演示


算法步骤
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
算法实现
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

3、简单插入排序
——通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

算法演示


算法步骤
从第一个元素开始,该元素可以认为已经被排序;
取出下一个元素,在已经排序的元素序列中从后向前扫描;
如果该元素(已排序)大于新元素,将该元素移到下一位置;
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
将新元素插入到该位置后;
重复步骤2~5。
算法实现
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

4、希尔排序
——希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。

算法演示


算法步骤
选择一个增量序列 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

5、归并排序
——建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

算法演示


算法步骤
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
设定两个指针,最初位置分别为两个已经排序序列的起始位置;
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重复步骤 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

6、快速排序
——快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

算法演示


算法步骤
从数列中挑出一个元素,称为 “基准”(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]
   

7、堆排序
——利用堆这种数据结构所设计的一种排序算法

算法演示


算法步骤
创建一个堆 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

8、计数排序
——作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

算法演示


算法步骤
找出待排序的数组中最大和最小的元素
统计数组中每个值为i的元素出现的次数,存入数组C的第i项
对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
算法实现
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

9、桶排序
——桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。

算法演示


算法步骤
设置一个定量的数组当作空桶;
遍历输入数据,并且把数据一个一个放到对应的桶里去;
对每个不是空的桶进行排序;
从不是空的桶里把排好序的数据拼接起来。
算法实现
function bucketSort(arr, bucketSize) {
    if (arr.length === 0) {
      return arr;
    }
 
    var i;
    var minValue = arr[0];
    var maxValue = arr[0];
    for (i = 1; i < arr.length; i++) {
      if (arr[i] < minValue) {
          minValue = arr[i];                // 输入数据的最小值
      } else if (arr[i] > maxValue) {
          maxValue = arr[i];                // 输入数据的最大值
      }
    }
 
    // 桶的初始化
    var DEFAULT_BUCKET_SIZE = 5;            // 设置桶的默认数量为5
    bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
    var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;  
    var buckets = new Array(bucketCount);
    for (i = 0; i < buckets.length; i++) {
        buckets[i] = [];
    }
 
    // 利用映射函数将数据分配到各个桶中
    for (i = 0; i < arr.length; i++) {
        buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);
    }
 
    arr.length = 0;
    for (i = 0; i < buckets.length; i++) {
        insertionSort(buckets[i]);                      // 对每个桶进行排序,这里使用了插入排序
        for (var j = 0; j < buckets[i].length; j++) {
            arr.push(buckets[i][j]);                     
        }
    }
 
    return arr;
}

10、基数排序
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

算法演示


算法步骤
取得数组中的最大数,并取得位数;
arr为原始数组,从最低位开始取每个位组成radix数组;
对radix进行计数排序(利用计数排序适用于小范围数的特点);
算法实现
var counter = [];
function radixSort(arr, maxDigit) {
    var mod = 10;
    var dev = 1;
    for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
        for(var j = 0; j < arr.length; j++) {
            var bucket = parseInt((arr[j] % mod) / dev);
            if(counter[bucket]==null) {
                counter[bucket] = [];
            }
            counter[bucket].push(arr[j]);
        }
        var pos = 0;
        for(var j = 0; j < counter.length; j++) {
            var value = null;
            if(counter[j]!=null) {
                while ((value = counter[j].shift()) != null) {
                      arr[pos++] = value;
                }
          }
        }
    }
    return arr;
}
————————————————
版权声明:本文为CSDN博主「苡~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44586883/article/details/120715016

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

十大经典排序算法 的相关文章

  • git push 遇见的两个错误

    文章目录 more than 10000 commits and skip validation not setprohibited by Gerrit update for creating new commit object not p
  • TGP无限验证码怎么办?

    使用账号密码登陆TGP时 xff0c 遇到了这样的一个情况 xff1a 不管验证码输入正确与否 xff0c 它都要求你再次输入 xff0c 可谓无限验证码 两个解决办法 1 先登录QQ xff0c 再使用QQ登陆 2 找到英雄联盟的安装目录
  • 怎么阅读论文,写心得体会

    收集资料 xff1a 阅读学术论文的心得体会 xff01 如何阅读学术论文 和上一篇类似大牛写论文的心得几年的写论文和审稿心得 文献阅读心得体会格式 xff1a 1 看论文题目 xff0c 做出论文类别判别 新理论 新方法 解决新问题 最高
  • tigerVNC的简单使用教程(CentOS的远程桌面连接)[解决Authentication Failure问题]

    参照教程 http blog csdn net daydreamingboy article details 8196747 开始连接CentOS远程桌面连接 但是出现Authentication Failure的情况 解决办法 xff1a
  • 基于docker的python faster-rcnn caffe环境搭建+提取目标特征实验

    文章目录 1 环境配置前言2 下载caffe镜像3 下载bottom up attention代码以及编译4 修改代码进行目标特征提取4 1 数据准备4 2 修改generate tsv py 起初是为了使用faster rcnn的目标提取
  • Tushare原学习文档(二投资参考数据)

    转tushare原网址 xff1a http tushare org trading html id2 import tushare as ts 1 分配预案 xff08 每到季报 年报公布的时段 xff0c 就经常会有上市公司利润分配预案
  • 通达OA系统故障解决案例记录

    案例1 xff1a 现象 xff1a 在人员访问量大的时候OA系统经卡死 xff0c 并且经常宕机 xff0c 需要启动apache服务 优化配置如下 xff1a D MYOA conf http conf 修改参数如下 xff1a lt
  • CentOS7系统安装KVM并配置网桥

    原文链接 CentOS7系统安装KVM并配置网桥 文章目录 一 安装虚拟化软件二 配置网桥 一 安装虚拟化软件 xff08 1 xff09 首先检查系统是否支持虚拟化 span class token function grep span
  • openEuler安装GNOME图形化桌面

    原文链接 openEuler安装GNOME图形化桌面 xff08 1 xff09 安装 GNOME 桌面 dnf groupinstall y GNOME xff08 2 xff09 安装 GNOME 应用 dnf span class t
  • Ubuntu----Ubuntu系统如何设置分辨率供VNC远程访问

    原文链接 Ubuntu Ubuntu系统如何设置分辨率供VNC远程访问 xff08 1 xff09 通过VMWare安装的Ubuntu虚拟机 xff0c 当通过VNC访问时 xff0c 默认情况下分辨率是不对的 xff0c 比如当VNCVi
  • 3D打印gcode命令大全及解析

    G0 xff1a 快速移动 G1 xff1a 控制移动 坐标轴XYZE移动控制 xff08 G0和G1一样 xff09 例子 xff1a G0 F2000 X30 Y30 Z30 E3 G2 xff1a 顺时针画弧 G3 xff1a 逆时针
  • 添加VNC开机启动

    1 添加开机启动文件 sudo nano etc init d tightvncserver 2 添加文件内容 bin sh BEGIN INIT INFO Provides tightvncserver Required Start sy
  • 以太网链路聚合&交换机堆叠集群

    随笔一篇 xff0c 以便日后翻阅 xff0c 如有问题欢迎指正 目录 前言 链路聚合技术原理一 基本原理二 基本术语及概念1 聚合组2 成员接口 amp 成员链路3 活动接口 amp 活动链路4 非活动接口 amp 非活动链路5 聚合模式
  • C#使用Setting保存用户自定义窗体位置

    1 首先引用原文 C 中使用Setting保存用户自定义窗体位置 C 中使用Setting保存用户自定义窗体位置 2008 11 06 步骤一 xff1a 打开项目属性窗口 xff0c 切换到设置 Settings 标签 xff0c 如下图
  • Keil5点击编译正常,烧录和调试直接闪退

    我在WIN11的环境下 xff0c 安装了目前ST官网上最新的MDK538 xff0c 刚刚下载好的前两天一切正常 xff01 但是就在刚刚出现了Keil编译正常 xff0c 使用正点原子的STLink烧录器下载却直接给我闪退 xff0c
  • Shell变量 —— 变量的赋值与引用

    Shell 变量的赋值与引用 变量用于存储数据由字母 数字或下划线组成 xff0c 并且只能以字母或下划线开头 xff0c 大小写的意义是不同的弱类型的语言 xff0c 变量存储的一切值都是字符串 到那时必要的时候 xff0c 是要是由数值
  • 利用USRP探索软件无线电(3)

    1 引言 上一篇描述了利用GQRX查看频谱和记录信号文件的过程 xff0c 本篇将实际录制和分析AM和FM信号 AM和FM虽然历史悠久 xff0c 且均为简单的模拟调制信号 xff0c 但是生命力很强 xff0c 目前仍有很多业务在使用 常
  • Linux安装配置FTP(pure-ftpd)

    1 默认的yum源没有提供pure ftpd xff0c 所以需要先安装epel release扩展源 然后使用yum命令安装pure ftpd yum span class token function install span epel
  • Linux文件检测和坏道检测(fsck、badblocks)

    文章目录 一 文件系统检测fsck二 磁盘坏道检测badblocks 一 文件系统检测fsck 命令功能fsck t dev sda1指定文件系统格式 xff0c 现在linux系统可以自动识别文件系统 xff0c 通常不需要此参数 fsc
  • VMware安装Centos8系统(中文图形化模式)

    文章目录 一 软件 系统镜像二 创建虚拟机三 安装CentOS8四 登录系统五 配置固定IP便于远程管理 一 软件 系统镜像 软件 xff1a VMware 14 镜像 xff1a CentOS8 镜像官网下载地址 xff1a http m

随机推荐

  • centos7系统kdump.service启动失败的解决方法

    1 查看系统启动的服务状态 systemctl list units type span class token operator 61 span service 2 编辑 etc default grub 文件 xff0c 修改crash
  • Linux磁盘故障和文件系统修复(救援模式Centos7、Centos8)

    文章目录 问题一 xff1a 文件系统分区变成只读文件系统 xff0c 无法写入新文件 新数据 问题二 xff1a 在Linux运行过程中 xff0c 有时会因为误操作导致磁盘故障 xff0c 系统无法启动 Linux救援模式 问题一 xf
  • linux安装最新版docker(centos7、centos8)

    文章目录 一 安装docker二 安装Docker镜像加速站三 下载docker镜像 xff08 以centos为例 xff09 xff0c 创建centos容器 xff0c 查看运行容器的IP四 容器设置固定的IP地址五 一款Docker
  • Linux安装最新版Nginx,配置解析php(centos7)

    文章目录 Nginx介绍一 安装编译工具及库文件二 安装PCRE xff0c 作用是让Nginx支持Rewrite功能三 安装Nginx四 测试Nginx五 Nginx常用命令六 安装PHP xff0c 配置nginx解析php Nginx
  • yum安装软件,提示没有可用的软件包解决方法(Centos 7、Centos8)

    文章目录 一 问题描述 xff08 以nginx为例 xff09 二 解决的方法 xff1a 安装epel release软件包三 EPEL简介 一 问题描述 xff08 以nginx为例 xff09 Centos 7下安装nginx xf
  • linux安装zabbix4,添加监测客户机(centos7)(一)

    文章目录 一 linux系统配置二 yum安装zabbix server三 配置zabbinx server四 登陆zabbix server xff0c 设置中文语言五 被监控客户端部署zabbix agent六 添加被监测客户机 软件版
  • linux安装使用git(centos7、centos8)

    文章目录 一 Git简介二 安装Git三 Git全局配置四 创建Git本地仓库五 Git版本回退 一 Git简介 Git是分布式版本控制系统 xff0c svn是集中式 集中式VS分布式 xff1a 集中式版本控制系统 xff0c 版本库集
  • 搜索和下载英文文献常用的网站

    最近导师要求对我们的研究课题进行一个综述整理以及ppt展示 xff0c 中文文献可以到知网上去查找 xff0c 不过知网上的外国文献基本上都很滞后 xff0c 无法拿来作为参考 xff0c 所以就滋生了对于国外期刊和会议论文的需求 搜索以下
  • zabbix监控方式(agent)(二)

    一 zabbix agent方式 xff08 被动模式 xff09 1 被动模式工作流程 xff1a zabbix server打开一个tcp连接 xff1b zabbix server放送一个key为agent ping n的请求 xff
  • MakBookAir系统(macOS Mojave10.14.2)安装双系统方法(win10)

    掉过的坑 1 W官网下载的64位ISO镜像内 xff0c 镜像解压后包含的单个文件大于4G xff0c 当使用BootCamp助理写入U盘时 xff08 U盘会被格式成FAT32 xff0c 不支持大于4G的单个文件拷贝 xff09 xff
  • SUMO文档016:XML文件验证

    XMLValidation xff08 XML验证 xff09 1 XML输入的验证 所有的SUMO应用程序都支持对输入的XML验证 为了实现功能 xff0c 以下的选项可以使用 xff1a Option Description X lt
  • SUMO应用工具:SUMO-GUI

    1 概览 sumo gui和sumo有着相同的功能 xff0c 仅仅是拥有图形化的界面 目的 xff1a 仿真一个特定的脚本 系统 xff1a 在Linux windows上测试过 xff0c 打开一个窗口 输入 xff1a sumo的配置
  • SUMO应用工具:DUAROUTER

    DUAROUTER 作者注 xff1a 原文链接 xff1a http sumo dlr de wiki DUAROUTER 1 简介 DAUrouter导入不同的需求定义 xff0c sumo计算车辆的路径得到最短的计算路径 当调用DUA
  • SUMO文档补充:OSMWebWizard

    Tutorials OSMWebWizard 原文地址 xff1a http sumo dlr de wiki Tutorials OSMWebWizard 1 简介 OSM Web Wizard 是开始sumo最简单的方式 可以选取区域进
  • SUMO文档:有关需求建模(Demand Modelling)

    Demand Introduction to demand modelling in SUMO 在生成了路网后 xff0c 我们可以在sumo gui上查看 xff0c 但是路网上并没有车辆运行 我们还需要一些有关车辆的描述 我们称之为 交
  • SUMO文档028:来源于观测点的路径

    Demand Routes from Observation Points 原文链接 xff1a http sumo dlr de wiki Demand Routes from Observation Points 自从0 9 5开始 x
  • 深度学习框架下群组行为识别算法综述

    源自 xff1a 电子学报 作者 xff1a 邓海刚 王传旭 李成伟 林晓萌 摘 要 群组行为识别目前是计算机视觉领域的一个研究热点 xff0c 在智能安防监控 社会角色理解和体育运动视频分析等方面具有广泛的应用价值 本文主要针对基于深度学
  • pci和pcie的区别

    原文地址 xff1a https blog csdn net u013253075 article details 80835489 最近在学习驱动开发过程中涉及到PCI相关知识 xff0c 在网上看了很多文章 xff0c 良莠不齐 xff
  • 一文道尽softmax loss及其变种

    1 softmax loss softmax loss是我们最熟悉的loss之一 xff0c 在图像分类和分割任务中都被广泛使用 Softmax loss是由softmax和交叉熵 cross entropy loss loss组合而成 x
  • 十大经典排序算法

    原文地址 xff1a 一文搞掂十大经典排序算法 不才伟才的博客 CSDN博客 一文搞掂十大经典排序算法 今天整理一下十大经典排序算法 1 冒泡排序 越小的元素会经由交换慢慢 浮 到数列的顶端 算法演示 算法步骤 比较相邻的元素 如果第一个比