【算法笔记(五)】排序算法

news2024/12/22 19:29:43

算法笔记(五)


排序算法

  • 算法笔记(五)
  • 前言
  • 一、冒泡排序
    • 1.什么是冒泡排序
    • 2.实际需求
    • 3.代码实现
  • 二、选择排序
    • 1.什么是选择排序
    • 2.需求规则
  • 三.插入排序
    • 1.了解插入排序
    • 2.需求规则
    • 3.代码实现
  • 四.希尔排序
    • 1.什么是希尔排序
    • 2.需求规则
    • 3.代码实现
  • 五.快速排序
    • 1.什么是快速排序
    • 2.需求规则
    • 3.代码演示
  • 六.归并排序
    • 1.什么是归并排序
    • 2.需求规则
    • 3.代码展示
  • 总结


前言

基础数据结构告一段落,现在开始一起学习排序算法


一、冒泡排序

1.什么是冒泡排序

冒泡排序(Bubble Sor)是把一组数据从左边开始进行两两比较交换,小的放前面,大的放后面,通过反复比较一直到没有数据需要交换为止。该排序方法由于很像水里的泡泡,从水底冒出的小泡泡升到水面变成大的,体现了从小到大的排序过程(如图所示)。
在这里插入图片描述

2.实际需求

(1)从队首开始,两两比较数值,把大的往后交换,一直到队尾,第一个最大值固定到最后。
(2)再从队首开始,依次两两比较,把次最大放到倒数第二位置。
(3)依次循环比较,直到完成所有数的比较和交换,完成冒泡排序。
人工图示演示
第一步,1=[9,0,6,5,3,10,36,2,1]列表传入自定义函数bubblesort(), n=9。
第二步,i=0, j=0, s:[0]=9, s[1]=0, s[0]>s[1]为真, 则把0放前面9放后面;然后,9与6进行比较,6放前面9放后面; 9与5比较,5放前面9放后面; 9与3比较,3放前面9放后面;9与10比较,无须交换; 10 与36比较,无须交换位置; 36 与2比较,2放前面36放后面; 36与1比较,1放前面36放最后。第一次循环比较结果如图4.2所示,最大的数36放到了最后。
第三步,i=1,j=0, s:[0]-0, s:[1]=6,0与6比较,无须交换位置: 6与5比较,5放前面6放后面: 6与3比较,3放前面6放后面; 6与9比较,无须交换位置: 9与10比较,无须交换位置:10与2比较,2放前面10放后面: 10与1比较,1放前面10放后面。第二次循环结束,如图所示。
在这里插入图片描述

3.代码实现

def bubblesort(s1):
    n = len(s1)
    for i in range(n):                           # 冒泡循环次数控制
        for j in range(n - i - 1):               # 冒泡循环一次,范围往前面缩1
            if s1[j] > s1[j + 1]:
                c1 = s1[j]                       # 把大的赋给c1
                s1[j] = s1[j + 1]                # 把小的换到前一位
                s1[j + 1] = c1                   # 把c1赋给后一位


l1 = [9, 0, 6, 5, 3, 10, 36, 2, 1]
print("排序之前的顺序", l1)
bubblesort(l1)
print("排序之后的顺序", l1)

运行结果
在这里插入图片描述

二、选择排序

1.什么是选择排序

选择排序是另外一一种简单的排序 方法。在数据集合里,通过轮循环找到最小值,把它放到第一个位置,然后在剩余的数据中再我最小值,放到第二个位置。以此类推,直到将所有值排序完成。

2.需求规则

(1)输入n个数值的列表,开始0到n-1轮的循环。
(2) 每轮循环记住最小值的下标,当前循环结束, 把最小值放到最前面。
(3)接着进行下一 轮循环,把最小值下标进行标记, 最后把最小值放到当前轮循环开始的位置。
(4)一直到第n-1轮,结束所有最小值的选择。
人工图示
第一步,把列表s1传入SeletSor(arr)自定义函数。
第二步 i = 0到5, j=i到S进行循环,每循环一次选择一个最小值,放到循环的最前面,循环比较过程如图
在这里插入图片描述

def selectsort(s1):
    n = len(s1)
    if n == 1:
        return 1
    for i in range(n):
        mid = i                                     # 获得每次循环第一个比较值的下标
        for j in range(i, n - 1):                   # 每次循环里寻找最小值
            if s1[mid] > s1[j + 1]:                 # 循环过程判断最小值
                mid += 1                            # 获得更小值的下标
        s1[i], s1[mid] = s1[mid], s1[i]             # 把最小的放到最前面


s1 = [3, 18, 0, 32, 2, 1]
print("排序之前:", s1)
selectsort(s1)
print("排序之后:", s1)

运行结果
在这里插入图片描述

三.插入排序

1.了解插入排序

插入排序(Insertion Sort)的原理是数列前而为排序完成的值,数列后面为未排序的值。取已
排序的值右边第一个 未排序的值CI,与已经排序的值进行比较,当C1大于当前值时,把当前值向后
移动1位,继续往前比较,当c小于当前值时,在当前位置插入Ci并把当前值向后移动1位,
完成一个循环的插入比较。接着进行下一轮的循环插入比较,一直 到所有未排序的值都完成插入
操作。第一次循环时,可以把数列第一。个值作为已经排序的数来看待,从第二个值开始进行插入
操作。

2.需求规则

(1)输入n个数值的列表。
2)先进行下标是0和1的数值比较,把大的放后面,小的插入前面,第1轮插入比较结束。
(3)继续选择下标是2的数值和下标是1的数值进行比较,大的后移1位,小的放到临时变量c中;然后继续比较c1和下标是0的数值,大的后移1位,小的插入前面。
(4)依次比较插入,一直到n-1轮结束比较, 获得最终排序结果。
人工图示演示
在这里插入图片描述

3.代码实现

def insertsort(arr):
    n = len(arr)
    if n == 1:
        return 1
    for i in range(1, n):
        c1 = arr[i]
        j = i
        while j > 0 and c1 < arr[j - 1]:
            arr[j] = arr[j - 1]
            j -= 1
        arr[j] = c1


l2 = [9, 3, 1, 5, 6]
print("排列前顺序", l2)
insertsort(l2)
print("排列后的顺序:", l2)

运行结果
在这里插入图片描述

四.希尔排序

1.什么是希尔排序

希尔排序(Sel Sor)又叫作缩小增量排序算法,是插入排序的一种更高效的改进算法。

2.需求规则

希尔排序的基本思想是:在n个元素的数列里,取增量spcn/数列开始值和增量尾值之间进行比较,小的放前面,大的放后面:把增量前后的数值都比较一遍, 然后增量数space减1,继续从头到尾做比较,并调整大小;一直到space=1,就完成了所有元素的大小调整和排序。
增量space的取法有各种方案。最初Shell提出取space=n//2向下取整,space =space//2 向下取整,直到increment=1。但由于直到最后一步,奇数位置的元素才会与偶数位置的元素进行比较,这祥使用这个序列的效率会很低。后来Knuth提出取spacen/3向下取整+1,还有人提出都取奇数也有人提出space互质。使用不同的序列会使希尔排序算法的性能有很大的差异。
人工演示图
在这里插入图片描述

3.代码实现

def sellsort(arr):
    n = len(arr)
    endi = 0                        # 最后修改下标
    if n == 1:
        return 1
    space = n // 3                  # 以列表中1/3作为增量
    while space > 0:
        for i in range(space):      # 控制一个变量循环space次
            key = arr[i]
            j = 0                   # 控制每个key元素在列表里比较次数
            while i + (j + 1) * space < n:
                print(f'交换开始下标数{j},交换结束{i + (j + 1) * space}')
                if space > 1:
                    if arr[i + (j + 1) * space] < key:
                        arr[i + j * space] = arr[i + (j + 1) * space]
                        endi = i + (j + 1) * space
                else:               # 当增量为1时,相邻元素比较并调整
                    if arr[j] > arr[j + 1]:
                        arr[j], arr[j + 1] = arr[j + 1], arr[j]
                j += 1
            if arr[i] != key:       # 必须考虑无需交换情况
                arr[endi] = key
        space -= 1


s1 = [18, 3, 0, 5, 2, 10, 7, 15, 38, 100]
print(f"排列前的为:{s1}")
sellsort(s1)
print(f"排列后的为:{s1}")

运行结果
在这里插入图片描述
在这里插入图片描述

五.快速排序

1.什么是快速排序

快速排序(Quick Sort)是对冒泡排序的一种改进, 由C.A.R.Hoare在1960年提出。它的基本思想是:通过一轮排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,直到整个数据变成有序序列。分割时,先选择一个元素作 为比较大小的基准(Pivot) 数。把数列里小于Pivot 数的元素放到前面,大于Pivot数的元素放到后面。这个基准数可以任意取一一个, 一般取开始、结束或中间位置的一个元素。
由于该算法需要把不同部分的两部分数据迭代缩小排序,所以采用了递归排序方法,通过空间换时间,实现快速排序。

2.需求规则

(1)选取列表最后一个数值作为基准数P, 把比P小的数放前面, 比P大的数放后面。
(2)分别对前面部分和后面部分的数据按照(1)的原则进行排列。
(3)一直到每部分的下标low==high,完成快速排序。
图示演示
在这里插入图片描述

3.代码演示

def movepivot(arr, low, hight):
    pivot = arr[hight]
    imove = (low - 1)
    for i in range(low, hight):
        if arr[i] <= pivot:
            imove += 1
            arr[imove], arr[i] = arr[i], arr[imove]
    arr[imove + 1], arr[hight] = arr[hight], arr[imove + 1]
    return imove + 1


def quicksort(arr, low, hight):
    if low < hight:
        pivot = movepivot(arr, low, hight)
        quicksort(arr, low, pivot - 1)
        quicksort(arr, pivot + 1, hight)


s1 = [10, 3, 28, 4, 12, 20]
print(f"排序前{s1}")
h = len(s1)
quicksort(s1, 0, h - 1)
print(f"排序后的结果{s1}")

结果如下
在这里插入图片描述

六.归并排序

1.什么是归并排序

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

2.需求规则

分治法先把数列分成相对均衡的两部分n/2,
然后再把左边的(eft) 子数列和右边的(right)
的子数列再各分成两部分:继续如此等分,直到只有一个元素。
等分过程采用递归方法,每分次, 在内存开辟临时的记录区域。所有元素分完后,开始大小比较归并,从两个元素比较归并到n/比较归并。
s1=[1,9,10,4,50,6,7,90,21,23,45],其数量长度为n=11
第一次分割, n//2=5,通过递归,把左边left[:5]存储到临时空间,右边right[:5]也如此。
第二次分制,把左边lelt[:5]分别为 left1[:2]、right1[2:] 右边right[5:]分割为left2[:7]、right2[7:]
第三次分割,在第二次分割的基础上再分别递归分割。
第四次分割,完成了所有元素的分割,分割为最小单元1.
接下来对分割完成的各个数列进行并归排序操作。
第一次并归,分别完成1和9的比较合并、4和50的比较合并,在前面合并的基础上生成了1、9、10、4、50子数组;同时完成了7和90比较合并、23和45比较合并。
第二次并归,实现了1、4、9、10、50的比较和并归,6、7、21、23、45、90的比较和并归。
第三次并归,实现了1、4、6、7、9、10、21、23、45、50、90所有元素的最终排序过程。
图示演示
在这里插入图片描述

3.代码展示

def mergesort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = mergesort(arr[:mid])
    right = mergesort(arr[mid:])
    return merge(left, right)


def merge(left, right):
    r, l = 0, 0
    temp = []
    lmax = len(left)
    rmax = len(right)
    while l < lmax and r < rmax:
        if left[l] <= right[r]:
            temp.append(left[l])
            l += 1
        else:
            temp.append(right[r])
            r += 1
    temp += list(left[l:])
    temp += list(right[r:])
    return temp

s1 = [1,9,10,4,50,6,7,90,21,23,45]
print(f"排列之前为{s1}")
print(f"排列之后为{mergesort(s1)}")

运行结果如下
在这里插入图片描述


总结

到此,排序算法就结束了,大家可以点击这里一起探讨吧,下章将带上检索算法的笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/30873.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

静态代理和动态代理

静态代理和动态代理代理模式代理模式的主要优缺点&#xff1a;优点&#xff1a;缺点&#xff1a;代理模式的编写要点静态代理实现步骤静态代理方式的弊端动态代理:动态代理的实现步骤:代理模式 代理模式的定义&#xff1a;由于某些原因需要给某对象提供一个代理以控制对该对象的…

Javascript 基础知识学习

Javascript 基础知识学习 参考自&#xff1a;https://www.w3cschool.cn/javascript/ javascript 简介 JavaScript 是互联网上最流行的脚本语言&#xff0c;这门语言可用于 HTML 和 web&#xff0c;更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。 JavaScri…

计算流体力学的基本方法简介(有限差分法、有限元法、有限体积法)

1、有限差分法&#xff1a; 原理&#xff0c;用差商代替微商&#xff1b; 优缺点&#xff1a; 2、有限元方法&#xff1a; 有限元剖分方法&#xff1a; 特点&#xff1a; 3、有限体积法&#xff1a; 两种方式&#xff0c;格心格式和格点格式&#xff1a; 特点&#xff1a;

基于html的美食网站——速水果介绍8页(HTML+CSS+JavaScript) 带论文

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家精彩专栏推荐 美食网页介绍 | 甜品蛋糕 | 地方美食小吃文化 | 餐饮文化 | 等网站的设计与制作 | 美食主题网站 | HTML期末大学生网页设计作业 HTML&…

SpringCloud全系列知识(1)——初识微服务和注册中心

SpringCloud(微服务)相关笔记 一 基础框架图 1.微服务技术栈 2.技术栈分类 二 认识微服务 1.单体架构 将业务功能集中在一个项目中&#xff0c;打成一个包部署。 优点&#xff1a;架构简单&#xff0c;部署成本低。 缺点&#xff1a;耦合度高 2.分布式架构 根据业务功能…

最具影响力的15颗国外开放数据气象卫星介绍

1.热带降雨测量任务(TRMM) TRMM 是 NASA 和日本宇宙航空研究开发机构 (以前称日本国家空间发展署) 的合作项目&#xff0c;是 NASA 地球科学计划中的航天任务。日本提供运载火箭和测雨雷达&#xff0c;而由 NASA 提供卫星、4台仪器和卫星运行系统。 TRMM 卫星是三轴稳定的&…

深度强化学习中利用Q-Learngin和期望Sarsa算法确定机器人最优策略实战(超详细 附源码)

需要源码和环境搭建请点赞关注收藏后评论区留下QQ~~~ 一、Q-Learning算法 Q-Learning算法中动作值函数Q的更新方向是最优动作值函数q&#xff0c;而与Agent所遵循的行为策略无关&#xff0c;在评估动作值函数Q时&#xff0c;更新目标为最优动作值函数q的直接近似&#xff0c;故…

深入理解java虚拟机:虚拟机类加载机制(2)

文章目录3.类加载器3.1 类与类加载器3.2 双亲委派模型3.3 破坏双亲委派模型3.类加载器 虚拟机设计团队把类加载阶段中的通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现&#xff0c;以便让应用程序自己决定如何去获取所需要的类。实现这个…

【密码学篇】数字签名基础知识(无保密性)

【密码学篇】数字签名基础知识&#xff08;无保密性&#xff09; 数字签名主要用于确认数据的完整性、签名者身份的真实性和签名行为的不可否认性等。—【蘇小沐】 文章目录【密码学篇】数字签名基础知识&#xff08;无保密性&#xff09;1.数字签名定义2.数字签名原理3.数字签…

Apache-DBUtils实现CRUD操作

Apache-DBUtils实现CRUD操作 每博一文案 有人说&#xff0c;不要轻易去伤害任何一个人&#xff0c;因为你会因此而受伤。欠的债&#xff0c;躲不掉&#xff0c;总是要还的。 要知道&#xff0c;哪些能被你欺骗的人&#xff0c;都是无条件相信你的人&#xff0c;因为心里有你&a…

【LeetCode-中等】240. 搜索二维矩阵 II(详解)

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/…

ROS之话题通信自定义msg

文章目录背景自定义msg例子1.定义msg文件2.编辑配置文件3.编译话题通信自定义msg调用A(C)0.vscode 配置1.发布方2.订阅方3.配置 CMakeLists.txt4.执行背景 在 ROS 通信协议中&#xff0c;数据载体是一个较为重要组成部分&#xff0c;ROS 中通过 std_msgs 封装了一些原生的数据…

【软考软件评测师】第三十三章 数据库系统应用

【软考软件评测师】第三十三章 数据库系统应用 【软考软件评测师】第三十三章 数据库系统应用【软考软件评测师】第三十三章 数据库系统应用第一部分 知识点集锦1.关系数据库候选码2.自然连接3.元祖关系1&#xff09;1对多关系2&#xff09;多对多关系3&#xff09;复合属性4&a…

Centos8界面语言怎么设置? Centos用户界面语言的设置方法

Centos8怎么给用户设置界面语言&#xff1f;想要设置界面语言&#xff0c;该怎么设置呢&#xff1f;下面我们就来看看详细的教程。 1、Gnome桌面环境下&#xff0c;在桌面空白处右键选择【设置】。 2、在【设置】中点【详细信息】。 3、之后点【用户】。 4、首先单击选中要设置…

ADS原理图到Layout,Layout更新原理图

RF Design-22 目录方法1&#xff1a;自动生成Generate/update Layout将理想元件转换为带footprint的元件统一修改元件参数生成Layout添加传输线&#xff0c;T节由Layout更新原理图Ground pouring覆铜设置地过孔方法2&#xff1a;place components from schem to Layout将原理图…

一种无需调查船上坞的调查设备安装测量方法和安装测量系统

本文来自于博主发明专利的技术交底。 大型科考船船底安装大型的精密测量设备&#xff0c;对安装的测量精度要求比较高&#xff0c;通过上坞&#xff0c;采用传统的测量方式&#xff0c;先做控制网&#xff0c;然后进行碎步测量&#xff0c;得到测量设备及其室内附属设备与船舶的…

Spring Cloud Ribbon面试题大全

Spring Cloud Ribbon面试题大全 目录 文档索引 面试题汇总 Q&#xff1a;Ribbon的总体流程&#xff1f; Q&#xff1a;Ribbon如何选择调用哪个实例&#xff1f; Q&#xff1a;服务列表的获取过程&#xff1f; Q&#xff1a;Ribbon如何避免调用失效实例&#xff1f; Q&am…

JavaScript高级复习上(59th)

1、类 constructor 构造函数 constructor() 方法是类的构造函数&#xff08;默认方法&#xff09;&#xff0c;用于传递参数&#xff0c;返回实例对象&#xff0c;通过new命令生成对象实例时&#xff0c;自动调用该方法。如果没有显示定义,类内部会自动给我们创建一个 constru…

【CPP】string 类的模拟实现

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;前言&…

Angular 学习 之 Hello World !

目录 0.前言・前提&#xff08;Angular介绍&#xff09; 前言 前提&#xff08;node.js已经按照&#xff09; 1.安装・查看版本 2.创建・启动Angular工程 2.1.创建工程 2.2.启动工程 2.3.启动之后&#xff0c;浏览器访问&#xff0c;显示的效果 2.4.工程目录结构 3.各…