超级详细解读基本排序算法(不看后悔,带排序演示动画)

首先来看比较简单的选择排序(Selectionsort),插入排序(Insertionsort),然后在分析插入排序的特征和缺点的基础上,介绍在插入排序基础上改进的希尔排序(Shellsort)。

原理:

选择排序很简单,他的步骤如下:

之所以称之为选择排序,是因为每一次遍历未排序的序列我们总是从中选择出最小的元素。下面是选择排序的动画演示:

实现:

算法实现起来也很简单,我们新建一个Sort泛型类,让该类型必须实现IComparable接口,然后我们定义SelectionSort方法,方法传入T数组,代码如下:

publicstaticvoidSelectionSort(T[]array){intn=array.Length;for(inti=0;iintmin=i;//从第i+1个元素开始,找最小值for(intj=i+1;jif(array[min].CompareTo(array[j])>0)min=j;}//找到之后和第i个元素交换Swap(array,i,min);}}//////元素交换////////////privatestaticvoidSwap(T[]array,inti,intmin){Ttemp=array[i];array[i]=array[min];array[min]=temp;}}下图分析了选择排序中每一次排序的过程,您可以对照图中右边的柱状图来看。

测试如下:

输出结果:

分析:

选择排序的在各种初始条件下的排序效果如下:

插入排序也是一种比较直观的排序方式。可以以我们平常打扑克牌为例来说明,假设我们那在手上的牌都是排好序的,那么插入排序可以理解为我们每一次将摸到的牌,和手中的牌从左到右依次进行对比,如果找到合适的位置则直接插入。具体的步骤为:

下面是插入排序的动画演示:

在Sort泛型方法中,我们添加如下方法,下面的方法和上面的定义一样

插入排序的在各种初始条件下的排序效果如下:

1.插入排序平均需要N2/4次比较和N2/4次交换。在最坏的情况下需要N2/2次比较和交换;在最好的情况下只需要N-1次比较和0次交换。

先考虑最坏情况,那就是所有的元素逆序排列,那么第i个元素需要与前面的i-1个元素进行i-1次比较和交换,所有的加起来大概等于N(N-1)/2~N2/2,在数组随机排列的情况下,只需要和前面一半的元素进行比较和交换,所以平均需要N2/4次比较和N2/4次交换。

在最好的情况下,所有元素都排好序,只需要从第二个元素开始都和前面的元素比较一次即可,不需要交换,所以为N-1次比较和0次交换。

2.插入排序中,元素交换的次数等于序列中逆序元素的对数。元素比较的次数最少为元素逆序元素的对数,最多为元素逆序的对数加上数组的个数减1。

3.总体来说,插入排序对于部分有序序列以及元素个数比较小的序列是一种比较有效的方式。

如上图中,序列AEELMOTRXPS,中逆序的对数为T-R,T-P,T-S,R-P,X-S6对。典型的部分有序队列的特征有:

对于部分有序数组,插入排序是比较有效的。当数组中逆元素的对数越低,插入排序要比其他排序方法要高效的多。

选择排序和插入排序的比较:

上图展示了插入排序和选择排序的动画效果。图中灰色的柱子是不用动的,黑色的是需要参与到比较中的,红色的是参与交换的。图中可以看出:

插入排序不会动右边的元素,选择排序不会动左边的元素;由于插入排序涉及到的未触及的元素要比插入的元素要少,涉及到的比较操作平均要比选择排序少一半。

希尔排序也称之为递减增量排序,他是对插入排序的改进。在第二部插入排序中,我们知道,插入排序对于近似已排好序的序列来说,效率很高,可以达到线性排序的效率。但是插入排序效率也是比较低的,他一次只能将数据向前移一位。比如如果一个长度为N的序列,最小的元素如果恰巧在末尾,那么使用插入排序仍需一步一步的向前移动和比较,要N-1次比较和交换。

希尔排序通过将待比较的元素划分为几个区域来提升插入排序的效率。这样可以让元素可以一次性的朝最终位置迈进一大步,然后算法再取越来越小的步长进行排序,最后一步就是步长为1的普通的插入排序的,但是这个时候,整个序列已经是近似排好序的,所以效率高。

如下图,我们对下面数组进行排序的时候,首先以4为步长,这是元素分为了LMPT,EHSS,ELOX,AELR几个序列,我们对这几个独立的序列进行插入排序,排序完成之后,我们减小步长继续排序,最后直到步长为1,步长为1即为一般的插入排序,他保证了元素一定会被排序。

希尔排序的增量递减算法可以随意指定,可以以N/2递减,只要保证最后的步长为1即可。

publicstaticvoidShellSort(T[]array){intn=array.Length;inth=1;//初始最大步长while(hwhile(h>=1){//从第二个元素开始for(inti=1;i//从第i个元素开始,依次次和前面已经排好序的i-h个元素比较,如果小于,则交换for(intj=i;j>=h;j=j-h){if(array[j].CompareTo(array[j-h])<0)=""{=""swap(array,=""j,=""j=""-=""h);=""}="">else//如果大于,则不用继续往前比较了,因为前面的元素已经排好序,比较大的大就是教大的了。break;}}//步长除3递减h=h/3;}}可以看到,希尔排序的实现是在插入排序的基础上改进的,插入排序的步长为1,每一次递减1,希尔排序的步长为我们定义的h,然后每一次和前面的-h位置上的元素进行比较。算法中,我们首先获取小于N/3的最大的步长,然后逐步长递减至步长为1的一般的插入排序。

下面是希尔排序在各种情况下的排序动画:

该序列由下面两个表达式交互获得:

“比较在希尔排序中是最主要的操作,而不是交换。”用这样步长的希尔排序比插入排序和堆排序都要快,甚至在小数组中比快速排序还快,但是在涉及大量数据时希尔排序还是比快速排序慢。

名称

最好

平均

最坏

内存占用

稳定排序

插入排序

n

n2

1

选择排序

希尔排序

nlog2n或n3/2

依赖于增量递减序列目前最好的是nlog2n

希望本文对您了解以上三个基本的排序算法有所帮助,后面将会介绍合并排序和快速排序。

THE END
1.学会Word中的数字排序,让你的文档更有序!学会Word中的数字排序,让你的文档更有序!风会教育 河南 0 打开网易新闻 体验效果更佳打开的阀门,真的太解压了 彩虹搞笑配音 1265跟贴 打开APP 工业切纸机虽然力量很大,但高度是有限的 全球不知道 485跟贴 打开APP 大姐晒自己工作过程,手法惹得网友爆笑,可千万别让老板看到! 搞笑老狗子 755跟贴 打开APP 全https://m.163.com/v/video/VQI45BPKN.html
2.在线排序演示排序在线演示在线排序算法cclina222 关注 0 1 觉得还不错? 一键收藏 0 专栏目录 多种排序算法演示软件 08-19 动态演示和分析七大排序算法「插入排序、选择排序、冒泡排序、归并排序 、希尔排序、快速排序、桶排序」的排序过程,使得排序过程更加容易理解。排序算法动态演示 04-12 实现了对冒泡,堆排序和插入排序的https://blog.csdn.net/qq_19313883/article/details/81660206
3.Python3实现对列表按元组指定列进行排序的方法分析pythonPS:这里再为大家推荐一款关于排序的演示工具供大家参考:在线动画演示插入/选择/冒泡/归并/希尔/快速排序算法过程工具: http://tools.jb51.net/aideddesign/paixu_ys更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python列表(list)操作技巧总结》、《Python编码操作技巧总结》、《https://www.jb51.net/article/153239.htm
4.高中信息技术:汤丽峰《选择排序算法》教学设计.doc高中信息技术:《选择排序算法》教学设计.doc,湖南省株洲市第十八中学 汤丽峰 PAGE PAGE 1 4.4排序算法设计——选择排序 一、案例背景信息 1、模块:算法与程序设计(选修)。2、年级:高二年级。 3、所用教材版本:广东教育出版社。 4、学时数:1课时,40分钟,其中上https://m.book118.com/html/2023/1118/8106113141006006.shtm
5.高中信息技术课程标准(2)通过实例,掌握使用数据查找算法设计程序解决问题的方法。 例 使用顺序查找算法和对分查找算法查找校运动会上某个班级或者某个运动员的比赛成绩。 (3)通过实例,掌握使用排序算法设计程序解决问题的方法。 例设计一个程序,按照选择交换法,把学校运动会比赛成绩(无序)按降序排序后存储。 https://www.fqkhzx.cn/index/article/view/id/94.html
6.2020届计算机科学方向毕业设计(论文)阶段性汇报图排序的硬件加速器设计 Gorder图排序算法的简单介绍,硬件加速Gorder的基本思路,模拟实验结果。 蒋泽天 多图的批量协同匹配与在线增量式匹配方法第一阶段工作汇报 多图的批量协同匹配与在线增量式匹配方法第一阶段工作汇报,主要包括研究内容回顾,先前方法复原情况,以及理论分析内容进展。 https://zhiyuan.sjtu.edu.cn/html/zhiyuan/announcement_view.php?id=3709
7.GitHubJourWon/sort插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素https://github.com/JourWon/sort-algorithm
8.快速排序算法算法原理 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。 步骤为: 从数列中挑出一个元素,称为“基准”(pivot), 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分割结束之后,该基准就处于数列https://tool.dreamlikes.cn/algorithm/quicksort
9.TCCT通讯Newsletter2017No.01加工时间离散可控的分批配送排序问题 系统科学与数学, 2016 Vol. 36 (10): 1652-1658 Abstract | PDF 李美娟,李晓轩,徐林明 基于改进理想解法的动态评价基于笔画特征的在线笔迹匹配算法 自动化学报, 2016 Vol. 42 (11): 1744-1757 Abstract | PDF 短文 刘晓东 针对一类非线性系统的多变量线性 扩张状态观测https://tcct.amss.ac.cn/newsletter/2017/201701/journal.html
10.科学网—Python学习笔记1:排序二、Sort方法的排序算法 正因为可以自定义cmp方法,不妨探究一下,built-in的sort方法,到底是采用的哪一种排序算法: from random import shuffle def my_cmp(E1, E2): print 'E1:', E1, 'E2:', E2 return cmp(E1, E2) L = range(0, 10) https://blog.sciencenet.cn/blog-243747-369619.html
11.吴师兄学算法的个人主页十大经典排序算法动画演示视频,看我就够了——堆排序 1207次观看2019年01月18日 00:23 十大经典排序算法动画演示视频,看我就够了——快速排序 862次观看2019年01月18日 00:21 十大经典排序算法动画演示视频,看我就够了——插入排序 734次观看2019年01月18日 https://m.ixigua.com/user/10500480991
12.快速排序在线编程现在给定一个整数数组,请用快速排序算法对该数组进行排序。 输入、输出描述 输入: a:待排非空整数数组 输出: 排序后的数组 Example 输入: a=[3,1,4,2] 输出: [1,2,3,4] 代码: importjava.util.*; publicclassMain{ publicint[]solution(int[]a){ https://k6k4.com/code/sshow/aaoxpweyb1597887379356
13.十大经典排序算法动画演示AlgorithmMan,一套免费的算法演示神器,附带GitHub开源下载地址。 1、Sorting Algorithms Animations 2、算法的分类 3、时间复杂度 算法 1、冒泡排序 它重复地访问要排序的元素列,一次比较两个相邻的元素,如果他们的顺序不符合预期就把他们交换过来。访问元素的工作是重复地进行直到没有相邻元素需要交换时为止。 https://www.jianshu.com/p/e9cfc2cc869c