排序算法总结

news/2025/2/22 5:49:56/

本文包含以下七种排序算法。

 一、插入排序

1.插入排序(Insert  Sort)的基本原理,每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象适当位置上,直到对象全部插入为止。   

2.算法步骤

①设待排序的记录存放在数组r[1····n]中,r[1]是个有序序列。

②循环n-1次,每次使用顺序查找法,查找r[i](i=2,···n)在已排好序的序列r[1···i-1]中的插入位     置,然后将r[i]插入表长为i-1的有序序列r[1···i-1],直到将r[n]插入表长为n-1的有序序列。说白了就是取出下一个元素,就把它放到前面排列好的序列中进行比较,进而确定位置  。

示例图:n=6,数组R的六个排序码分别为:17,3,25,14,20,9。

 二、希尔shell排序

1.基本思想:设待排序的数据对象有n个,首先取一个整数d  <  n作为间隔,将全部对象分为d个子序列,所有距离为d的对象放在同一个序列中,在每一个子序列中分别施行直接插入排序,然后缩 小间隔d,如取d=d/2。重复上述的子序列划分和排序工作,直到最后取d为1为止。

2.说白了就是将序列拆分成几个序列,然后各自进行排序,然后再拆分得细一点再排序,直到1.

 三、冒泡排序

1.基本思想:通过两两比较相邻的关键字,如果发生逆序,则进行交换,从而使关键字小的记录    如气泡一般向上漂浮,或者使关键字大的记录像石头一样逐渐向下坠落。

2.说白了就是每趟排序都以整个序列为单位,比较相邻的元素进行排序。

 四、快速排序

1.基本思想:取待排序的结点序列中某个结点的值作为控制值(一般是第一个),采用某种方法把这个结点放到适当的位置,使得这个位置的左边的所有结点的值都小于等于这个控制值,而这个位置的右边的所有结点的值都大于等于这个控制值。然后分别对这两个子序列重复实施上述方法。

2.说白了就是以第一个数组元素作为关键数据,赋给key,即key=A[0],从 j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换。  从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和     A[j]互换。

3.示例图:

 五、选择排序

 1.基本思想:在每一趟带排序的记录中选出关键字最小的记录,按照顺序排放在已经排好序的记     录序列的最后,直到序列全部有序。

2.比如求正向排序,第一次就是从序列中找最小的,然后交换位置,第二趟就找次小的,然后交换

3.

六、堆排序

1.基本思想:堆是完全二叉树。

①堆所对应的完全二叉树的根结点是元素序列中的值最小或最大元素。

②从根结点到每一个叶子结点的路径上的元素组成的序列都是按元素值递增或递减。

③堆可以采用一维数组来存储。

2.筛选法调整堆方法:

从r[2s]和r[2s+1]中选出关键字较大者,假设r[2s]的关键字较大,比较r[s]和r[2s]的关键字

①若r[s].key>=r[2s].key,说明以r[s]和r[2s]为根的子树已经是堆,不必做调整。

②若r[s].key<r[2s].key。交换后,以r[2s+1]为根的子树仍是堆,如果r[2s]为根的子树     不是堆,则重复上述过程,将以r[2s]为根的子树调整为堆,直至进行到叶子结点为止。

3.说白了就是从最下面的非叶节点开始比较大小进行排序

七、归并排序(2-路归并排序)

1.基本思想:假设初始的对象序列有n个数据对象,我们首先把它看成是n个长度为1的有序子序列,先做两两归并,得到n/2个长度为2的归并项(如果n为奇数,则最后一个有序子序列的长     度为1);再做两两归并,……,如此重复,最后得到一个长度为n的有序序列。

2. ①将当前序列一分为二,求出分裂点mid=⌊(low+high)/2⌋;

②对子序列R[low,mid]递归,进行归并排序,结果放入S[low,mid]中;

 ③对子序列R[mid+1,high]递归,进行归并排序,结果放入S[mid+1,high]中;

④将有序的两个子序列S[low,mid]和Smid+1,high]归并为一个有序序列T[low,high].

3.刚开始以单个元素为单位,两两比较排序,然后是两个元素为单位继续排序...

 

 


http://www.ppmy.cn/news/66315.html

相关文章

注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs)

目录 写在前面一、暴力破解Basic-3-Brute 11.解题思路2.Burp Suite工具使用简介 二、基于GET的SQL注入Pre.使用校园网做题时可能遇到的小问题 2.1 Basic-4-SQL course 1&#xff08;sql注入&#xff09;1.解题思路 2.2 Basic-8-sqli-labs&#xff08;sql注入的各种攻击形式&…

用正则表达式校验手机号和邮箱

用正则表达式校验手机号和邮箱 在现代互联网时代&#xff0c;手机号和邮箱已经成为了人们日常生活中不可或缺的联系方式。作为开发人员&#xff0c;校验用户输入的手机号和邮箱的合法性是非常必要的。本文将介绍如何使用正则表达式校验手机号和邮箱的格式是否正确。 校验手机…

关于一个C++项目:高并发内存池的开发过程(一)

原项目地址&#xff1a;高并发内存池项目: 高并发内存池项目的课堂板书代码 (gitee.com) 写在前面 本打算利用五一假期的时间将这个项目一口气开发完成&#xff0c;但由于本人的懈怠&#xff0c;这个项目最终只完成了80%。于是利用长假后的一天假期&#xff0c;将这个项目的框…

5分钟搞懂矩阵乘法的本质

大家好啊&#xff0c;我是董董灿。 很多与深度学习算法相关的面试&#xff0c;面试官可能都会问一类问题&#xff0c;那就是你是如何理解矩阵乘算法的。 更有甚者&#xff0c;会让你当场手写矩阵乘算法&#xff0c;然后问细节&#xff0c;问如何优化&#xff0c;面试现场&…

总结846

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;张宇强化前10讲&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;张宇强化前3讲并完成相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#…

ChatGPT 联网和插件功能,下周起可直接使用,无需排队!

夕小瑶科技说 分享 来源 | 新智元 OpenAI和谷歌&#xff0c;已经打得急红了眼&#xff0c;ChatGPT Plus用户&#xff0c;下周就可以体验联网和插件功能&#xff0c;无需再排队。鲨疯了&#xff0c;真的鲨疯了&#xff01; ChatGPT&#xff0c;下周开始联网&#xff0c;并开放插…

第四十九章 Unity UI适配器组件

首先&#xff0c;我们介绍内容大小适配器 (Content Size Fitter)组件。 我们新建一个“SampleScene6.unity”场景&#xff0c;然后添加一个Text UI元素&#xff0c;让其居中显示&#xff0c;并且尺寸设置为50*30。 由于我们设置Text的尺寸在水平方向上面太小&#xff0c;也就是…

mysql索引失效的情况及其原因

mysql索引失效的情况及其原因&#xff1f; 答&#xff1a; 条件查询使用了or关键字且部分字段没有使用索引&#xff0c;则会走全表扫描。&#xff08;如果两边的字段都有索引的话&#xff0c;那么索引就不会失效&#xff09;。 因为MySQL优化执行计划目标都是出于成本考虑&a…